int32_t
我最近在一个 C 程序中遇到了数据类型。我知道它存储 32 位,但不这样int
做int32
吗?
另外,我想char
在程序中使用。我可以int8_t
改用吗?有什么不同?
总结一下:C中的int32,int,int32_t,int8和int8_t有什么区别?
int32_t
我最近在一个 C 程序中遇到了数据类型。我知道它存储 32 位,但不这样int
做int32
吗?
另外,我想char
在程序中使用。我可以int8_t
改用吗?有什么不同?
总结一下:C中的int32,int,int32_t,int8和int8_t有什么区别?
between int32
and int32_t
, (以及同样 between int8
and int8_t
)的区别非常简单:C 标准定义了int8_t
and int32_t
,但没有定义任何名为int8
orint32
的东西——后者(如果它们存在的话)可能来自其他一些头文件或库(很可能早于 C99中添加int8_t
和)。int32_t
平原int
与其他的有很大不同。where int8_t
and int32_t
each 有一个指定的大小,int
可以是任何大小 >= 16 位。在不同的时间,16 位和 32 位都相当普遍(对于 64 位实现,它可能应该是 64 位)。
另一方面,int
保证在 C 的每个实现中都存在,无论在int8_t
哪里int32_t
。不过,这对您是否重要可能还有待商榷。如果您在小型嵌入式系统和/或较旧的编译器上使用 C,则可能会出现问题。如果你主要在桌面/服务器机器上使用现代编译器,它可能不会。
糟糕——错过了关于char
. 如果(且仅当)您希望整数类型保证为 8 位大小时,您将使用int8_t
而不是 char。如果要存储字符,则可能要char
改用。它的大小可能会有所不同(就位数而言),但可以保证恰好是一个字节。不过有一点奇怪:无法保证普通文本char
是有符号的还是无符号的(许多编译器可以将其设为其中之一,具体取决于编译时标志)。如果您需要确保其被签名或未签名,则需要明确指定。
_t 数据类型是 stdint.h 标头中的 typedef 类型,而 int 是内置的基本数据类型。这使得 _t 仅在 stdint.h 存在时可用。另一方面, int 保证存在。
请始终记住,如果未明确指定,“大小”是可变的,因此如果您声明
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 以获得更好的理解并不是一件坏事。