为什么偏向负数?

时间:2010-07-03 08:27:00

标签: integer twos-complement

如果在我的编译器上,int是16位,那么它的范围是-32768到32767(在2的补码机器中)。
我想知道为什么负数有1个额外的没有。即正数转为32767 但负面的还有一个,即32768。

-32768如何用2的补码m / c表示?

5 个答案:

答案 0 :(得分:6)

在16位上,您可以将pow(2,16)(2到16的幂)组合成不同的组合来表示65536个数字。确定零看起来最好代表000 ... 000并且“二补”系统中的正数通常是可读的(它们等于所谓的“自然二进制”表示,如0000 0000 0000 0101 = 5十进制等)

二进制补码中的负数以1111 1111 1111 1111开头,表示-1。把它想象成一个数字为997,998,999的计数器表盘,突然当它必须代表1000它溢出并显示000时。原理在这里是相同的,但方向是相反的 - 来自... 000到... 111。 -2表示为1111 .... 1110等等。

二进制补码中最低的数字前面有1,其余数字为零。

答案 1 :(得分:3)

如果你正在寻找一个简单,脚踏实地的答案:

没有任何偏见。在正面和负面都有相同数量的数字,正数从0开始,负数从-1开始,因此差异为1。 :)

答案 2 :(得分:1)

实际上并没有任何“偏见”。设置最高有效位时,该数字为负。对于“正数空间”(即,MSB 设置),以及1-32767,您有零,因此明显缺少32768。

-32768将由0b1000000000000000表示。见link text

答案 3 :(得分:1)

没有负零。 (-0)。这就是为什么它似乎是一种偏见。如果设置了最后一位,那么它被认为是负数。一个字节中还有另外7位可以在正负范围内设置。

答案 4 :(得分:1)

另一种思考方式是制作1位有符号变量。签名意味着必须有负数,当然会有正数。所以你可以得到1个正面的负数,你用两个数字照片?现在让它2比特,你有2个正面和负面?真正的秘密是最后一点代表否定。

如果我们想将0视为负数,则需要额外的工作。如果负0则会很浪费。