考虑一下:
1. printf(“%d”, sizeof(32767));
2. printf(“%d”, sizeof(-32767));
3. printf(“%d”, sizeof(-32768));
1和2产生的结果为2,而第三个语句产生了4.但int
的范围是-32768到32767.为什么单独的第三个语句有差异?有人能解释一下吗?
int
中的是2。
答案 0 :(得分:6)
值-32768
不被语言视为单个项目,它由两部分组成 - 符号和值。
当上限为32767时,值32768
不能为int
。因此,它确定为更大的类型,如long
。只有在那之后才会应用这个标志。
答案 1 :(得分:3)
编译器将此读取为-
应用于常量32768.由于32768超出int
的范围(在此特定编译器中),它将被提升为long
。
事实上,许多标准标头的实现都会将INT_MIN
定义为(-32767-1)
,以避免出现此问题。
答案 2 :(得分:1)
默认情况下,整数常量为int
,但在必要时(当long
不适合{{1}时)会被提升到足够大的最小尺寸(例如int
) }})。
如果int
是16位,那么(对于2的补码),最大理论范围是-32768到+32767。但是,在实践中,这会破坏abs()
之类的内容,因为不可能(对于16位)返回abs(-32768)
的有效值。编译器可以通过将INT_MIN
设置为-32767来避免此问题;以便abs()
对int
的所有有效值都能正常运行,并且不会意外地在您面前爆炸(例如abs(-32768) = -32768
)。
最终结果是理论上可以适合16位int
的整数常量-32768可以提升为long
,因为它小于INT_MIN
。