La forma en que entiendo int16_t
o int32_t
en C es que están tipificados para ser números de 16 y 32 bits respectivamente en su computadora. Creo que los usaría cuando necesite garantizar que un número es de 16 o 32 bits porque los diferentes sistemas no siempre representan un int
como 32 bits o un short
como 16 bits (¿Es correcta esta suposición? Encuentro respuestas mixtas cuando busco en línea).
Mi pregunta es ¿cómo usaría una función como scanf
para obtener información de un usuario con un int16_t
o un int32_t
o cualquiera de los otros tipos de números tipificados cuando necesito que sean de 16 bits o 32 bits o lo que sea? ¿Hay algún tipo de modificador de cadena especial? Normalmente, si quisiera obtener un int
de un usuario sin importar qué tan grande se represente realmente, ya que escribiría algo como esto
scanf("%d", &int);
Esto funciona si paso en un int32_t
pero supongo que es sólo porque un int
en mi sistema es de 32 bits y no me da específicamente un número de 32 bits, sino que solo me da un int
. ¿Cómo haría para obtener un número garantizado de 32 bits? he mirado esta página de modificadores de cadenas y algunos otros lugares, pero no he encontrado ninguna mención de estos tipos de números tipificados.
Editar: Desde que recibí una respuesta a mi pregunta, busqué en Google y encontré esta. Lo incluí a continuación como referencia también.
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
por
int16_t
:scanf("%" SCNd16 , &var)
porint32_t
:scanf("%" SCNd32 , &var)
.#include <inttypes.h>
– PIXY AZUL
28/10/2014 a las 21:08
@PaulGriffiths Esto está cerca, pero no es un duplicado real. La sutil diferencia es que
printf
debería usar elPRI*
macros mientrasscanf
debería usarSCN*
macros– Las vidas de los uigures importan
28/10/2014 a las 21:12
Tenga en cuenta que lo anterior es para avr-gcc, una versión de gcc para microcontroladores. Las definiciones específicas para su plataforma probablemente serán diferentes. En Linux, puede encontrar las macros SCN… en
/usr/include/inttypes.h
.–Kevin Chen
27 de septiembre de 2017 a las 0:17