使用sizeof运算符的整数范围

时间:2012-05-19 08:13:15

标签: c sizeof

考虑一下:

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

1和2产生的结果为2,而第三个语句产生了4.但int的范围是-32768到32767.为什么单独的第三个语句有差异?有人能解释一下吗?

我的编译器大小int中的

是2。

3 个答案:

答案 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