为什么SCHAR_MIN在C99中定义为-127?

C99的5.2.4.2.1将SCHAR_MIN定义为-127,将SCHAR_MAX定义为127. 8位有符号整数的范围不应该是-128到+127吗?

我的编译器的limits.h将SCHAR_MIN定义为(-1 << ((CHAR_BIT)-1)) ,如果CHAR_BIT为8,则为-128。

是否有任何理由为什么SCHAR_MIN被定义为-127而不是-128?

它实际上没有将SCHAR_MIN定义为-127,它将有符号字符的最小范围定义为-127..127。

它这样做是因为它必须能够处理有符号数的其他两种编码方案,那些是补码和符号/幅度。 这两个都有正负零,偷走了你在二进制中找到的-128。

ISO C(C99)第6.2.6.2/2节规定,实现必须为签名的整数数据类型选择以下三种不同表示中的一种:

  • 二补;
  • 补充; 要么
  • 符号/幅值

这两个补充实现远远超过其他实现,但其他实现存在。

在所有这些表示中,正数是相同的,唯一的区别是负数。

要获得正数的负面表示,您:

  • 反转所有位然后添加一个用于二进制补码。
  • 将所有位反转为1的补码。
  • 只反转符号/符号位。

对于5和0,您可以在下表中看到这一点:

号码| 二的补充| 那些'补充| 符号/幅值
 ======= | ===================== | ==================== = | ====================
      5 |  0000 0000 0000 0101 |  0000 0000 0000 0101 |  0000 0000 0000 0101
     -5 |  1111 1111 1111 1011 |  1111 1111 1111 1010 |  1000 0000 0000 0101
        |  |  |
      0 |  0000 0000 0000 0000 |  0000 0000 0000 0000 |  0000 0000 0000 0000
     -0 |  0000 0000 0000 0000 |  1111 1111 1111 1111 |  1000 0000 0000 0000
            (没有区别)(两者都有明显的+/- 0)