关于char范围的混淆

时间:2014-02-22 08:31:59

标签: c binary char range twos-complement

我们知道char的范围是-128127

-128的2赞和128的二进制是相同的,这是

  

千万

那么为什么char的范围是-128127而不是-127128
int的情况下,128-128两者都不同。

3 个答案:

答案 0 :(得分:4)

在二进制补码表示法中,只要高位为1,数字就为负数。所以最大的正数是

01111111 = 127

,最小的负数是

10000000 = -128

同样的事情发生在int,但它的范围要大得多。最大的积极因素是

01111111 11111111 11111111 11111111 = 2147483647

,最小的负数是

10000000 00000000 00000000 00000000 = -2147483648

正如您所看到的,在这两种情况下,最小的负数比最大的正数多1倍。

您可能想知道,如果除了符号位之外的位数相同,为什么还有更多的负数而不是正数?那是因为您没有计算0 。它在高位中为0,所以在这种表示法中它被认为是正数。当你包含它时,有128个负字符和128个非负字符,它们平衡均衡。

答案 1 :(得分:0)

一个字符有8位。因此,当你有8位处理时,-128和128的位模式是相同的。 (忽略符号位)

现在是int。它有更多的位,因此MSB不是-128,而是一个更大的-ve数,具体取决于平台。

它确实在“更高”的数字上表现出相同的问题

答案 2 :(得分:0)

看128是

10000000

但默认情况下,char是签名编译器将第一位视为符号位并处理no。 为负数并计算其2s补码(因为MSB为1)

2s complement is
 01111111
      +        1
 10000000

所以 - 存储了128 要存储+128编译器必须考虑要解释的9位

010000000

这里MSB为0表示正数。但是大小是9位,这说明为什么char只能容纳+127,如果我们想存储+128,那么-128将被存储,如上所述