Cómo usar int16_t o int32_t con funciones como scanf [duplicate]

5 minutos de lectura

avatar de usuario
guribe94

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)por int32_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 el PRI* macros mientras scanf debería usar SCN* 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

Para aquellos que necesitan usar las macros de inttypes.h tal como SCNd64 o SCNu32 etc

scanf("%" SCNd32, &x);

  • ¿Es esto parte del estándar C99?

    – ahora buey

    14 de noviembre de 2019 a las 14:51

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad