How to use int16_t or int32_t with functions like scanf
For those you need to use the macros from inttypes.h
such as SCNd64
or SCNu32
etc.
scanf("%" SCNd32, &x);
Related videos on Youtube
guribe94
Updated on July 09, 2022Comments
-
guribe94 almost 2 years
The way that I understand
int16_t
orint32_t
in C is that they are typedefed to be 16 and 32 bit numbers respectively on your computer. I believe you would use these when you need to guarentee a number is 16 or 32 bits because different systems do not always represent anint
as 32 bits or ashort
as 16 bits (Is this assumption correct? I find mixed answers when I look online.).My question is how would I use a function like
scanf
to get input from a user with aint16_t
or aint32_t
or any of the other typedefed number types when I require them to actually be 16 bits or 32 bits or whatever? Is there some sort of special string modifier? Normally if I wanted to get anint
from a user without caring about how large it is actually represented as I would write something like thisscanf("%d", &int);
This works if I pass in a
int32_t
but I assume it is only because anint
on my system is 32 bits and it does not specifically give me a 32 bit number instead it just gives me anint
. How would I go about getting number that is guarenteed to be 32 bits? I have looked on this page of string modifiers and a few other places but have found no mention of these typedefed number types.Edit: Since receiving an answer to my question I have done some Googling and found this. I included it below for reference as well.
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
-
BLUEPIXY over 9 yearsfor
int16_t
:scanf("%" SCNd16 , &var)
, forint32_t
:scanf("%" SCNd32 , &var)
.#include <inttypes.h>
-
Uyghur Lives Matter over 9 years@PaulGriffiths This is close, but not an actual duplicate. The subtle difference is that
printf
should use thePRI*
macros whilescanf
should useSCN*
macros. -
Kevin Chen over 6 yearsNote that the above is for avr-gcc, a version of gcc for microcontrollers. The specific definitions for your platform will likely be different. On Linux, you can find the SCN... macros in
/usr/include/inttypes.h
.
-
-
nowox over 4 yearsIs this part of the C99 standard?