在C语言中,我理解int16_t
或int32_t
是typedef定义的,分别代表计算机上的16位和32位数字。当不同系统的int
或short
并非总是表示为32位或16位时,您可能会使用它们来确保数字为16位或32位(这种假设正确吗?当我在网上搜索时,得到了不同的答案)。
我的问题是:如果我需要实际为16位或32位等typedef数字类型的输入,我该如何使用诸如scanf
之类的函数从用户那里获取输入?是否有某种特殊的字符串修饰符?通常,如果我只需要从用户那里获取一个int
而不关心它实际上被表示为多大,我会写出以下代码:
scanf("%d", &int);
如果我传入一个 int32_t
,这个方法就能工作,但我认为这只是因为我的系统上的 int
是32位,而它并没有明确给我一个32位的数字,而只是给了我一个 int
。我应该如何获取保证为32位的数字?我已经在这个字符串修饰符页面和其他一些地方搜索过,但没有找到关于这些typedefed数字类型的提及。
编辑:自从得到了这个问题的答案之后,我查找了一些资料,并在 这里 找到了参考资料。uppercase hexadecimal printf format for uintptr_t
#define SCNd16 "d"
decimal scanf format for int16_t
#define SCNd32 "ld"
decimal scanf format for int32_t
#define SCNd8 "hhd"
decimal scanf format for int8_t
#define SCNdFAST16 "d"
decimal scanf format for int_fast16_t
#define SCNdFAST32 "ld"
decimal scanf format for int_fast32_t
#define SCNdFAST8 "hhd"
decimal scanf format for int_fast8_t
#define SCNdLEAST16 "d"
decimal scanf format for int_least16_t
#define SCNdLEAST32 "ld"
decimal scanf format for int_least32_t
#define SCNdLEAST8 "hhd"
decimal scanf format for int_least8_t
#define SCNdPTR SCNd16
decimal scanf format for intptr_t
#define SCNi16 "i"
generic-integer scanf format for int16_t
#define SCNi32 "li"
generic-integer scanf format for int32_t
#define SCNi8 "hhi"
generic-integer scanf format for int8_t
#define SCNiFAST16 "i"
generic-integer scanf format for int_fast16_t
#define SCNiFAST32 "li"
generic-integer scanf format for int_fast32_t
#define SCNiFAST8 "hhi"
generic-integer scanf format for int_fast8_t
#define SCNiLEAST16 "i"
generic-integer scanf format for int_least16_t
#define SCNiLEAST32 "li"
generic-integer scanf format for int_least32_t
#define SCNiLEAST8 "hhi"
generic-integer scanf format for int_least8_t
#define SCNiPTR SCNi16
generic-integer scanf format for intptr_t
#define SCNo16 "o"
octal scanf format for uint16_t
#define SCNo32 "lo"
octal scanf format for uint32_t
#define SCNo8 "hho"
octal scanf format for uint8_t
#define SCNoFAST16 "o"
octal scanf format for uint_fast16_t
#define SCNoFAST32 "lo"
octal scanf format for uint_fast32_t
#define SCNoFAST8 "hho"
octal scanf format for uint_fast8_t
#define SCNoLEAST16 "o"
octal scanf format for uint_least16_t
#define SCNoLEAST32 "lo"
octal scanf format for uint_least32_t
#define SCNoLEAST8 "hho"
octal scanf format for uint_least8_t
#define SCNoPTR SCNo16
octal scanf format for uintptr_t
#define SCNu16 "u"
decimal scanf format for uint16_t
#define SCNu32 "lu"
decimal scanf format for uint32_t
#define SCNu8 "hhu"
decimal scanf format for uint8_t
#define SCNuFAST16 "u"
decimal scanf format for uint_fast16_t
#define SCNuFAST32 "lu"
decimal scanf format for uint_fast32_t
#define SCNuFAST8 "hhu"
decimal scanf format for uint_fast8_t
#define SCNuLEAST16 "u"
decimal scanf format for uint_least16_t
#define SCNuLEAST32 "lu"
decimal scanf format for uint_least32_t
#define SCNuLEAST8 "hhu"
decimal scanf format for uint_least8_t
#define SCNuPTR SCNu16
decimal scanf format for uintptr_t
#define SCNx16 "x"
hexadecimal scanf format for uint16_t
#define SCNx32 "lx"
hexadecimal scanf format for uint32_t
#define SCNx8 "hhx"
hexadecimal scanf format for uint8_t
#define SCNxFAST16 "x"
hexadecimal scanf format for uint_fast16_t
#define SCNxFAST32 "lx"
hexadecimal scanf format for uint_fast32_t
#define SCNxFAST8 "hhx"
hexadecimal scanf format for uint_fast8_t
#define SCNxLEAST16 "x"
hexadecimal scanf format for uint_least16_t
#define SCNxLEAST32 "lx"
hexadecimal scanf format for uint_least32_t
#define SCNxLEAST8 "hhx"
hexadecimal scanf format for uint_least8_t
#define SCNxPTR SCNx16
hexadecimal scanf format for uintptr_t
int16_t
:scanf("%" SCNd16 , &var)
,对于int32_t
:scanf("%" SCNd32 , &var)
。#include <inttypes.h>
。 - BLUEPIXYprintf
应使用PRI*
宏,而scanf
应使用SCN*
宏。 - Uyghur Lives Matter/usr/include/inttypes.h
中找到SCN...宏。 - Kevin Chen&int
是什么意思? - Radzor