ChatGPT解决这个技术问题 Extra ChatGPT

Difference between int32, int, int32_t, int8 and int8_t

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?


M
Matt Quigley

Between int32 and int32_t, (and likewise between int8 and int8_t) the difference is pretty simple: the C standard defines int8_t and int32_t, but does not define anything named int8 or int32 -- the latter (if they exist at all) is probably from some other header or library (most likely predates the addition of int8_t and int32_t in C99).

Plain int is quite a bit different from the others. Where int8_t and int32_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, where int8_t and int32_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 use int8_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 use char 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 plain char 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.


@linuxfreak: Not sure about bool_t -- never heard of that one before. The C standard defines _Bool as a built-in type. bool is defined only if you #include <stdbool.h> (as a macro that expands to _Bool).
You said "for a 64-bit implementation, (int) should probably be 64 bits". In practice, int is 32-bits on all common 64-bit platforms including Windows, Mac OS X, Linux, and various flavors of UNIX. One exception is Cray / UNICOS but they are out of fashion these days.
@SamWatkins: Yes, that's why I carefully said "should be", not "is". The standard says it's "the natural size suggested by the architecture", which (IMO) means on a 64-bit processor, it really should be 64 bits (though, for better or worse, you're quite right that it usually isn't). From a more practical viewpoint, it is awfully handy to have a 32-bit type among the types in C89, and if int is 64 bits, long has to be at least 64 bits too, so there'd often be no 32-bit type.
@barlop: Yes. (Both C and C++ mandate a minimum range of 255 values for char, so it requires at least 8 bits, but can be more).
I was always under the impression that one byte was exactly 8 bits, not anywhere from 8 bits on up
S
Superman

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.


Why would one use the _t ones?
@Deven To avoid the case where your code works somewhere but not somewhere else.
N
Naumann

Always keep in mind that 'size' is variable if not explicitly specified so if you declare

 int i = 10;

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

 typedef short INT16;
 typedef int INT32;
 typedef long INT64; 

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

 typedef signed char       int8_t;
 typedef signed short      int16_t;
 typedef signed int        int32_t;
 typedef unsigned char     uint8_t;

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.


Your code has a typo: typedef short INT16;, not typedefs short INT16.