I came across the data type int32_t
in a C program recently. I know that it stores 32 bits, but don't int
and int32
do the same?
Also, I want to use char
in a program. Can I use int8_t
instead? What is the difference?
To summarize: what is the difference between int32, int, int32_t, int8 and int8_t in C?
Between
int32
andint32_t
, (and likewise betweenint8
andint8_t
) the difference is pretty simple: the C standard definesint8_t
andint32_t
, but does not define anything namedint8
orint32
-- the latter (if they exist at all) is probably from some other header or library (most likely predates the addition ofint8_t
andint32_t
in C99).Plain
int
is quite a bit different from the others. Whereint8_t
andint32_t
each have a specified size,int
can be any size >= 16 bits. At different times, both 16 bits and 32 bits have been reasonably common (and for a 64-bit implementation, it should probably be 64 bits).On the other hand,
int
is guaranteed to be present in every implementation of C, whereint8_t
andint32_t
are not. It's probably open to question whether this matters to you though. If you use C on small embedded systems and/or older compilers, it may be a problem. If you use it primarily with a modern compiler on desktop/server machines, it probably won't be.Oops -- missed the part about
char
. You'd useint8_t
instead of char if (and only if) you want an integer type guaranteed to be exactly 8 bits in size. If you want to store characters, you probably want to usechar
instead. Its size can vary (in terms of number of bits) but it's guaranteed to be exactly one byte. One slight oddity though: there's no guarantee about whether a plainchar
is signed or unsigned (and many compilers can make it either one, depending on a compile-time flag). If you need to ensure its being either signed or unsigned, you need to specify that explicitly.Always keep in mind that 'size' is variable if not explicitly specified so if you declare
On some systems it may result in 16-bit integer by compiler and on some others it may result in 32-bit integer (or 64-bit integer on newer systems).
In embedded environments this may end up in weird results (especially while handling memory mapped I/O or may be consider a simple array situation), so it is highly recommended to specify fixed size variables. In legacy systems you may come across
Starting from C99, the designers added stdint.h header file that essentially leverages similar typedefs.
On a windows based system, you may see entries in stdin.h header file as
There is quite more to that like minimum width integer or exact width integer types, I think it is not a bad thing to explore stdint.h for a better understanding.
The _t data types are typedef types in the stdint.h header, while int is an in built fundamental data type. This make the _t available only if stdint.h exists. int on the other hand is guaranteed to exist.