-128和128 in 2的补码

时间:2013-06-09 08:00:32

标签: binary twos-complement

在2的补码中,0-127表示为00000000到01111111.如果是负数,我们将无符号表示中的所有位反转,并加1以得到2的补码。

(参考:http://en.wikipedia.org/wiki/Signed_number_representations#Two.27s_complement

所以2的补码中的-1将是:


 unsigned 1 =      00000001

 invert all bits = 11111110

 add 1 =           11111111

但对于-128,如果我们遵循相同的步骤:


 unsigned 128 =    10000000

 invert all bits=  01111111

 add 1=            10000000

所以-128和128在2的补码表示法中具有相同的表示形式?为什么8位的2的补码范围不是-127到128?简而言之,为什么-128优先于使用相同位数表示无符号128?

3 个答案:

答案 0 :(得分:8)

有符号字节中没有“128”。范围是

  • 0到127:128值
  • -1到-128:128个值

总共256个值,即2 ^ 8。

附录基于评论(并重读问题)

0x80可能被视为-128或+128。 Wikipedia explanation值得一读

  

该范围内最小数字的二进制补码将无法取消数字的预期效果。

     

例如,8位系统中的-128的二进制补码导致相同的二进制数。这是因为128的正值不能用8位有符号二进制数表示。注意,这被检测为溢出条件,因为存在进位但不是最高有效位。这可能会导致意外错误,因为在最小负数的情况下,未经检查的绝对值实现可能会返回负数。 C中的整数函数的abs族通常具有此行为。 Java也是如此。在这种情况下,开发人员可以决定在调用函数之前是否检查最小负值。

     

两个补码中最负的数字有时被称为“奇数”,因为它是唯一的例外。虽然该数字是例外,但它是常规二进制补码系统中的有效数字。所有算术运算都可以作为操作数和(除非有溢出)结果。

此外,对有符号整数进行右移会使CPU将MSb(第7位)向右传播,如果0x80为+128则会违反简单逻辑,因为在仅一次移位后,我们将获得0xC0这是一个负数(-64)...(而正数的右移通常可以从不产生否定结果)。

答案 1 :(得分:6)

由于符号位约定,

-128优于128。在带符号的数字表示中,最高有效位被视为符号位。如果该位为1,则该数字为负数。在128和-128(10000000)的表示中,该位为1,因此它表示-128,而不是128.

请参阅http://en.wikipedia.org/wiki/Sign_bit

答案 2 :(得分:1)

为了保持MSB为符号位