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

Posted

技术标签:

【中文标题】int32、int、int32_t、int8和int8_t的区别【英文标题】:Difference between int32, int, int32_t, int8 and int8_t 【发布时间】:2013-01-09 01:36:05 【问题描述】:

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

另外,我想在程序中使用char。我可以改用int8_t 吗?有什么区别?

总结一下:C语言中的int32、int、int32_t、int8和int8_t有什么区别?

【问题讨论】:

【参考方案1】:

int32int32_t 之间(同样在int8int8_t 之间)区别非常简单:C 标准定义了int8_tint32_t,但没有定义任何名为@987654327 的东西@ 或 int32 -- 后者(如果它们存在的话)可能来自其他一些头文件或库(很可能早于在 C99 中添加 int8_tint32_t)。

Plain int 与其他的有点不同。其中int8_tint32_t 都有一个指定的大小,int 可以是任何大小>= 16 位。在不同的时期,16 位和 32 位都相当普遍(对于 64 位实现,它可能应该是 64 位)。

另一方面,int 保证存在于 C 的每个实现中,而 int8_tint32_t 则不存在。不过,这对您是否重要可能还有待商榷。如果您在小型嵌入式系统和/或较旧的编译器上使用 C,则可能会出现问题。如果你主要在桌面/服务器机器上使用现代编译器,它可能不会。

糟糕——错过了关于char 的部分。如果(且仅当)您希望整数类型保证为 8 位大小时,您将使用 int8_t 而不是 char。如果你想存储字符,你可能想改用char。它的大小可能会有所不同(就位数而言),但可以保证恰好是一个字节。不过有一点奇怪:无法保证普通的 char 是有符号还是无符号(许多编译器可以将其设为其中之一,具体取决于编译时标志)。如果您需要确保它是已签名或未签名的,则需要明确指定。

【讨论】:

@linuxfreak:不确定bool_t——以前从未听说过。 C 标准将_Bool 定义为内置类型。 bool 仅在您使用 #include <stdbool.h> 时定义(作为扩展为 _Bool 的宏)。 您说“对于 64 位实现,(int) 可能应该是 64 位”。实际上,int 在所有常见的 64 位平台上都是 32 位的,包括 Windows、Mac OS X、Linux 和各种版本的 UNIX。一个例外是 Cray / UNICOS,但它们现在已经过时了。 @SamWatkins:是的,这就是为什么我小心地说“应该”,而不是“是”。该标准说它是“架构建议的自然大小”,这(IMO)意味着在 64 位处理器上,它真的应该是 64 位(尽管,无论好坏,你是完全正确,通常不是)。从更实际的角度来看,在 C89 的类型中拥有一个 32 位类型非常方便,如果 int 是 64 位,那么 long 也必须至少是 64 位,所以有d 通常不是 32 位类型。 @barlop:是的。 (C 和 C++ 都要求 char 的最小范围为 255 个值,因此它至少需要 8 位,但可以更多)。 我一直认为一个字节正好是 8 位,而不是 8 位以上的任何地方【参考方案2】:

_t 数据类型是 stdint.h 头文件中的 typedef 类型,而 int 是内置的基本数据类型。这使得 _t 仅在 stdint.h 存在时可用。另一方面 int 保证存在。

【讨论】:

为什么要使用 _t 的? @Deven 为了避免您的代码在某处工作但在其他地方无法工作的情况。【参考方案3】:

请记住,如果没有明确指定,'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 以获得更好的理解并不是一件坏事。

【讨论】:

您的代码有错字:typedef short INT16;,而不是 typedefs short INT16

以上是关于int32、int、int32_t、int8和int8_t的区别的主要内容,如果未能解决你的问题,请参考以下文章

由于缓存,为啥访问 int8_t 数组并不比 int32_t 快?

Redis---set

我可以使用 int8_t 代替 char 吗?

uint和int的区别

C++数据类型范围

在 int 上使用 __int16(或 int16_t)的优点/缺点