3

考虑一下:

1. printf(“%d”, sizeof(32767));
2. printf(“%d”, sizeof(-32767));
3. printf(“%d”, sizeof(-32768));

1 和 2 的结果为 2,而第三条语句的结果为 4。但是 的范围int是从 -32768 到 32767。为什么仅第三条语句就有区别?谁能解释一下?

在我的编译器中,大小int为 2。

4

3 回答 3

6

-32768不被语言视为单个项目,它由两部分组成 - 符号和值。

当上限为 32767 时,该值32768不能为 an ,因此确定为较大的类型,如. 只有在那之后才应用标志。intlong

于 2012-05-19T09:23:59.123 回答
3

编译器将其读取为-应用于常量 32768。由于 32768 超出了int(在此特定编译器中)的范围,它将被提升为long.

事实上,标准头文件的许多实现都定义INT_MIN了,比如说,(-32767-1)为了避免这个问题。

于 2012-05-19T09:27:16.260 回答
1

默认情况下,整数常量,但在必要时(当它们不适合 时)int被提升为足够大以容纳它们的最小尺寸(例如)。longint

如果 anint是 16 位,那么(对于 2 的补码)最大理论范围是从 -32768 到 +32767。但是,在实践中,这会破坏诸如abs()不可能(对于 16 位)为abs(-32768). 编译器可以通过设置INT_MIN为 -32767 来避免该问题;这样abs()对于 的所有有效值都可以正确运行,int并且不会意外地在您的脸上炸毁(例如abs(-32768) = -32768)。

这样做的最终结果是,理论上可以适合 16 位的整数常量 -32768int可能会被提升为,long因为它小于INT_MIN.

于 2012-05-19T09:36:03.263 回答