在C标准中写道,即int
应具有:
但在实现中,即在16位机器上,值为:
为什么负值会有这种差异?
答案 0 :(得分:5)
两个范围都有效,异常是第一个[-32767 ... 32767]但根据C标准完全正确。
在许多实现中,短整数的最小值为-(2^15 - 1)
,然后是-32768
。你会看到它被定义为:
#define SHRT_MIN 0x7FFF
#define SHRT_MIN (-32767 - 1)
#define SHRT_MIN (-32768)
标准断言它必须是(-2^15 + 1)
(然后-32767
)或更少(因为实际值取决于特定的系统和库实现)。因为大多数实现使用二进制补码来表示负数(当零对于整数无符号时),则最小负值小一个单位。在实践中,这意味着您可以确保在编写程序时(无论编译器和平台如何)至少可以将-32767
存储在short
中(但对于某些编译器/平台,范围可能更宽)正如你在编译器中看到的那样)。
请注意,在这种情况下,-32768
有意义(适用于sizeof(int) > sizeof(short)
)的平台,与MIN_INT
不同,因为字面值实际上是int
(不是short
)。