Подтвердить что ты не робот

Как использовать int16_t или int32_t с такими функциями, как scanf

То, как я понимаю int16_t или int32_t в C, состоит в том, что они набираются как 16 и 32-разрядные номера соответственно на вашем компьютере. Я полагаю, что вы будете использовать их, когда вам нужно гарантировать, что число равно 16 или 32 битам, потому что разные системы не всегда представляют int как 32 бита или short как 16 бит (это предположение верно? Я нахожу смешанные ответы когда я смотрю онлайн.).

Мой вопрос заключается в том, как использовать функцию типа scanf для ввода данных от пользователя с помощью int16_t или int32_t или любого другого типа типерованных номеров, когда я требую, чтобы они фактически составляли 16 бит или 32 бит или что-то еще? Есть какой-то специальный модификатор строки? Обычно, если я хотел получить int от пользователя, не заботясь о том, насколько он представлен на самом деле, я бы написал что-то вроде этого

scanf("%d", &int);

Это работает, если я передаю int32_t, но я предполагаю, что это только потому, что int в моей системе 32 бита, и он не дает мне 32-битного номера, а просто дает мне int, Как я могу получить номер, который должен быть 32 бита? Я просмотрел эту страницу модификаторов строк и несколько других мест, но не нашел упоминания об этих типах типерованных номеров.

Изменить:. После получения ответа на мой вопрос я сделал некоторый Googling и нашел this. Я также включил его ниже для справки.

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
4b9b3361

Ответ 1

Для тех, кому нужно использовать макросы из inttypes.h, такие как SCNd64 или SCNu32 и т.д.

scanf("%" SCNd32, &x);