int32、int、int32_t、int8和int8_t之间的区别

150

我最近在一个C程序中遇到了数据类型int32_t。我知道它存储32位,但是intint32不是也一样吗?

另外,我想在程序中使用char。我可以用int8_t代替吗?它们之间有什么区别?

总结一下:C语言中int32、int、int32_t、int8和int8_t有何不同?

3个回答

171
int32int32_t 之间(同样地,在 int8int8_t 之间),它们的区别非常简单:C 标准定义了 int8_tint32_t,但没有定义任何名为 int8int32 的类型 -- 后者(如果它们存在的话)可能来自于其他头文件或库(很可能早于 C99 中添加的 int8_tint32_t)。
相比之下,普通的 int 与其他类型有很大不同。虽然每个 int8_tint32_t 都有一个指定的大小,但是 int 可以是任何大小>=16位。在不同的时间里,16 位和 32 位都是相当普遍的(对于 64 位实现,应该是 64 位)。
另一方面,int 在每个 C 实现中都保证存在,而 int8_tint32_t 不保证存在。但这是否对您有影响仍需讨论。如果在小型嵌入式系统上和/或使用旧编译器,则可能会有问题。如果主要在桌面/服务器机器上使用现代编译器,则可能不会有问题。

哎呀——我漏掉了关于char的部分。如果(只有当)您需要一个确切大小为8位的整数类型,那么您应该使用int8_t而不是char。如果您想存储字符,您可能想要使用char。它的大小可以变化(按位数计算),但其大小保证为一个字节。但是有一个小小的怪异之处:不能保证普通的char是带符号还是无符号的(许多编译器可以根据编译时标志将其设置为任意一种)。如果您需要确保它是带符号或无符号的,您需要明确指定。


1
@linuxfreak:不确定bool_t是什么——以前从未听说过。C标准将_Bool定义为内置类型。只有在您包含<stdbool.h>(作为扩展到_Bool的宏)时,才会定义bool - Jerry Coffin
6
你说:“对于一个64位实现,(int) 可能应该是64位。”但在实践中,包括Windows、Mac OS X、Linux以及各种UNIX的所有常见64位平台上,int都是32位。唯一的例外是Cray/UNICOS,但这些已经过时了。 - Sam Watkins
6
@SamWatkins:是的,这就是为什么我小心地说“应该是”,而不是“是”。标准规定它是“建议体系结构自然大小”,这意味着在64位处理器上,它真的应该是64位(尽管,无论好坏,你对于它通常不是这样的看法是正确的)。从更实际的角度来看,有一个32位类型作为C89中的类型之一确实非常方便,如果int是64位,那么long至少也必须是64位,因此通常没有32位类型。 - Jerry Coffin
2
@barlop:是的。(C和C++都规定char类型的最小范围为255个值,因此需要至少8位,但可以更多)。 - Jerry Coffin
3
我一直以为一个字节恰好等于8个比特,而不是从8个比特开始的任何数。 - ErlVolton
显示剩余11条评论

31

_t数据类型是在stdint.h头文件中的typedef类型,而int是一个内置的基本数据类型。这意味着只有在存在stdint.h头文件时,_t才可用。另一方面,保证int存在。


3
为什么有人会使用“_t”这个词尾? - Deven
1
@Deven 为了避免你的代码在某些地方能够正常工作而在其他地方不能正常工作的情况。 - Franklin Yu

10

请始终记住,如果没有明确指定,'size'是可变的。因此,如果您声明

 int i = 10;

在一些系统中,编译器可能会产生16位整数,在另一些系统中可能会得到32位整数(在新的系统上可能是64位整数)。

在嵌入式环境中,这可能会导致奇怪的结果(特别是在处理内存映射I/O或考虑简单的数组情况时),因此强烈建议指定固定大小的变量。在旧系统中,你可能会遇到

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

从C99开始,设计者增加了stdint.h头文件,该头文件可以利用类似的typedef。

在基于Windows的系统上,您可能会看到stdin.h头文件中的条目如下:

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

还有一些其他类型,例如最小宽度整型或精确宽度整型等,我认为探索stdint.h可以更好地理解。


5
你的代码中有一个错别字:应该是typedef short INT16;而不是typedefs short INT16。请注意修正。 - Galaxy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接