Int32,int,int32_t,int8和 int8_t 的区别

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

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

总结: 在 C 中,int32,int,int32 _ t,int8和 int8 _ t 的区别是什么?

270138 次浏览

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不出现在 C 的每一个实现中。不过这对你来说是否重要还是个问题。如果您在小型嵌入式系统和/或较老的编译器上使用 C,那么这可能是一个问题。如果您主要在桌面/服务器机器上使用现代编译器,那么它很可能不会被使用。

哎呀,忘了说 char了。如果(并且仅当)您希望保证整数类型的大小正好为8位,那么可以使用 int8_t代替 char。如果要存储字符,则可能需要改为使用 char。它的大小可以变化(根据位的数量) ,但它保证正好是一个字节。不过有一点有点奇怪: 不能保证纯 char是有符号的还是无符号的(很多编译器根据编译时标志的不同,可以将其设置为有符号的或无符号的)。如果需要确保它是有符号的还是无符号的,则需要显式地指定它。

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

请始终记住,如果没有明确指定,那么“ 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 并不是一件坏事。