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


103

int32_t最近在C程序中遇到了数据类型。我知道,它存储32位,但不要intint32这样做?

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

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

Answers:


122

之间int32int32_t,(同样地之间int8int8_t)的区别很简单:C标准定义int8_tint32_t,但不定义任何命名int8int32-后者(如果它们都存在)可能是从一些其他的头或库(最有可能早于C99中的int8_tint32_t)。

平原int与其他地方有很大的不同。where int8_tint32_t每个都有指定的大小,int可以是大于等于16位的任何大小。在不同的时间,16位和32位是相当普遍的(对于64位实现,可能应该是64位)。

另一方面,int保证在C的每个实现中都存在,int8_tint32_t不是。但这是否对您很重要,值得怀疑。如果在小型嵌入式系统和/或较旧的编译器上使用C,则可能会出现问题。如果您主要将其与台式机/服务器计算机上的现代编译器一起使用,则可能不会。

糟糕-错过了有关的部分charint8_t如果(且仅当)您希望保证整数类型的大小恰好为8位时,才使用char代替。如果要存储字符,则可能要使用char。它的大小可以变化(就位数而言),但可以保证恰好是一个字节。不过,有一点奇怪:不能保证char无格式是带符号的还是无符号的(许多编译器可以使它成为一个,取决于编译时标志)。如果需要确保其已签名或未签名,则需要明确指定。


1
@linuxfreak:不确定bool_t-以前从未听说过。C标准定义_Bool为内置类型。bool仅在您#include <stdbool.h>(作为扩展为的宏_Bool)时定义。
杰里·科芬

5
您说过“对于64位实现,(int)应该为64位”。实际上,在所有常见的64位平台(包括Windows,Mac OS X,Linux和各种UNIX)上,int是32位。Cray / UNICOS是一个例外,但如今它们已经过时了。
山姆·沃特金斯

6
@SamWatkins:是的,这就是为什么我仔细地说“应该是”而不是“是”。该标准说这是“体系结构建议的自然大小”,这(IMO)表示在64位处理器上,它实际上应该是64位(不过,无论好坏,您通常都说这是正确的) t)。从更实际的角度来看,这非常方便的在C89的类型中的32位类型,如果int是64位的,长的有至少64位也一样,所以会经常没有32位类型。
杰里·科芬

2
@barlop:是的。(C和C ++都要求char的最小范围为255个值,因此它至少需要8位,但可以更多)。
杰里·科芬

2
我一直给人的印象是,一个字节恰好是8位,而不是8位以上的任何地方
ErlVolton

18

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


1
为什么要使用_t呢?
2016年

@Deven为避免您的代码在其他地方而不是其他地方工作的情况。
富兰克林·于

2

请始终牢记,如果未明确指定“大小”是变量,则在声明时

 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以获得更好的理解不是一件坏事。


1
您的代码有错别字:typedef short INT16;,而不是typedefs short INT16
银河
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.