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

Sum*_*Raj 7 c c99 char language-lawyer

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

limits.h我的编译器定义为SCHAR_MIN (-1 << ((CHAR_BIT)-1)),这是给CHAR_BIT -128是8.

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

pax*_*blo 26

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

它这样做是因为它必须能够处理有符号数的其他两种编码方案,那些是补码和符号/幅度.这些都具有积极消极的零,偷掉你补找到-128.

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

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

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

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

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

  • 反转所有位然后加一个用于二进制补码.
  • 将所有位反转为1的补码.
  • 仅反转符号位的符号/幅度.

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

number | two's complement    | ones' complement    | sign/magnitude
=======|=====================|=====================|====================
     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
           (no difference)        (both of these have distinct +/-0)

  • @paxdiablo:只有当你指的是一长串Knuth时,它才应该是Knuths. (11认同)
  • 从技术上讲,它是*Ones'*补充,而不是*One's*补充.它们是有区别的 :-). (3认同)
  • 我的参考是*计算机程序设计的艺术*.不同之处在于*Ones'*补码是关于长串的,而*Two的*补码不是关于长串的两个. (2认同)