为什么在一些编译器中int的大小有所不同?
这个问题在这里已经有了答案:
虽然“为什么”可以用“因为标准是这样说”来回答的,人们可以说标准可以写成不同的方式来保证特定的尺寸。
但是,C和C ++的目的是在所有机器上生成非常快速的代码。 如果编译器必须确保int
对于该机器来说是一个“不自然的大小”,那就需要额外的指令。 对于几乎所有的情况,这都不是必需的,你所关心的只是它足够“足够我想做”。 所以,为了给编译器一个很好的机会来生成“好代码”,该标准只规定了最小尺寸,避免编译器不得不生成“额外代码”来使int
(和其他类型)以非常特定的方式运行。
C和C ++的许多优点之一就是有编译器可以针对大量机器,从小型8位和16位微控制器到大型64位多核处理器(如PC中的)。 当然,也有一些18,24或36位的机器。 如果您的机器的本地大小为36位,那么如果由于某些标准的说法,您将不会很高兴,由于额外的指令,您会得到整数数学性能的一半,并且不能使用int
...
具有8位寄存器的小型微处理器通常支持16位加法和减法(也可能是乘法和除法),但是32位数学将涉及这些指令的加倍[以及更多用于乘法和除法]。 所以16位整数(2字节)在这样一个小处理器上会更有意义 - 特别是因为内存可能不是很大,所以为每个整数存储4个字节有点浪费。 在32位或64位机器中,内存范围很可能要大得多,因此整数较大并不是什么缺点,而32位整数操作与较小的整数操作速度相同(并且在某些情况下“更好” - 例如在x86中,16位简单的数学运算(如加法或减法)需要额外的前缀字节来表示“make this 16-bit”,所以16位整数的数学计算会占用更多的代码空间)。
因为C标准说:
(C99,6.2.5p5)“一个普通的”int对象具有执行环境的体系结构所建议的自然大小“
C仅为int
( INT_MAX
)可容纳的最大值定义最小值, int
可容纳最小值的最大值( INT_MIN
)。