考虑一下:
1. printf(“%d”, sizeof(32767));
2. printf(“%d”, sizeof(-32767));
3. printf(“%d”, sizeof(-32768));
1 和 2 的结果为 2,而第三条语句的结果为 4。但是 的范围int
是从 -32768 到 32767。为什么仅第三条语句就有区别?谁能解释一下?
在我的编译器中,大小int
为 2。
值-32768
不被语言视为单个项目,它由两部分组成 - 符号和值。
当上限为 32767 时,该值32768
不能为 an ,因此确定为较大的类型,如. 只有在那之后才应用标志。int
long
编译器将其读取为-
应用于常量 32768。由于 32768 超出了int
(在此特定编译器中)的范围,它将被提升为long
.
事实上,标准头文件的许多实现都定义INT_MIN
了,比如说,(-32767-1)
为了避免这个问题。
默认情况下,整数常量,但在必要时(当它们不适合 时)int
被提升为足够大以容纳它们的最小尺寸(例如)。long
int
如果 anint
是 16 位,那么(对于 2 的补码)最大理论范围是从 -32768 到 +32767。但是,在实践中,这会破坏诸如abs()
不可能(对于 16 位)为abs(-32768)
. 编译器可以通过设置INT_MIN
为 -32767 来避免该问题;这样abs()
对于 的所有有效值都可以正确运行,int
并且不会意外地在您的脸上炸毁(例如abs(-32768) = -32768
)。
这样做的最终结果是,理论上可以适合 16 位的整数常量 -32768int
可能会被提升为,long
因为它小于INT_MIN
.