该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
int 数据类型所占字节数由编译器根据 C 标准的实现决定的
C99 标准只明确规定了 int 类型的数值表达范围,具体可以参考头文件 limite.h(/usr/include/limite.h) 以及 stdint.h(/usr/include/stdint.h)。它并没有明确规定 int 数据类型的字长。
这样规定的好处是令 C 语言具有更好的移植性,编译器在具体实现时只要令 int 的字长足够描述 C 标准规定的数值范围即可。试想如果规定死了 int 的字长,万一目标平台处理器无法支持那该如何是好呢?例如在以前的 PDP-7 (unix 诞生地)上,其字长是 18 位,和我们常见的以 8 为基数的字长(8,16,32,64)很不相同,如果以字长来规定的话,在其上实现 C 标准就颇为麻烦。
所以,int 字长到底是多少要看编译器如何实现。原则上在满足 C 标准的前提下,为了发挥目标平台的处理效率,编译器设计 int 的字长时会尽量令其与目标平台处理器的字长相同。
根据 C99 标准中的规定,int 类型的数字范围至少应该能表达 -32767 -- +32767(Annex E
(informative) Implementation limits)。
#define INT_MAX +32767
#define INT_MIN -32767
因此,int 类型的字长至少需 16 位(2字节)。
综上所述,根据 int 表达范围(至少 2 字节)和执行效率(int 字长 = 处理器字长)这两个条件,在常见的 Intel 体系上,我们就会见到 int 的字长有 16位(2字节),32位(4字节),64位(8字节)等几种。具体长度可以通过 sizeof(int) 求出来。
一般来说,在做计算时我们通常不太需要关心 int 的字长(除非涉及符号和溢出),但涉及到位操作,或者系统边界领域如存储到文件、实现网络协议时,数据类型的字长就很重要了。
如果需要进一步了解 C 标准的细节的话,推荐直接看 C99 标准文档,可以直接到网上去搜索。