C 类型的取值范围

3

C标准规定int应该具有以下值:

  • 最小值-32767,最大值32767

但在实现中,即在16位机器上,这些值为:

  • 最小值-32768,最大值32767

为什么负值的差异如此之大?


3
取决于平台在处理负数时使用的是二进制补码还是一进制补码。http://en.wikipedia.org/wiki/Two's_complement - Nick
标准允许存在负零的系统,这在某些情况下是有意义的 :) - pmg
真是个惊喜!“short int类型对象的最小值为SHRT_MIN -32767 // −(2^15 − 1)”,见于“N1570委员会草案-2011年4月12日ISO/IEC 9899:201x”的第45页。这是一个很好的面试问题,我以前从未回答正确过。 - Jongware
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
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)。

我感到困惑。你说:“它必须是...-32767”,但接着你又说“它可以更少”。这是矛盾的。 - user1619508
@JoeHass,你说得对,应该重新表述为“它必须是...或更少”(因为上限必须至少为“至少”)。 - Adriano Repetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,