2补码中的-128和128是什么?

16
在二进制补码中,0-127被表示为00000000到01111111。对于负数,我们将无符号表示中的所有位取反并加1以获得二进制补码。
(参考资料:http://en.wikipedia.org/wiki/Signed_number_representations#Two.27s_complement
因此,在二进制补码中,-1将是:
 无符号1 =           00000001
取反所有位 = 11111110
加1 = 11111111
但对于-128,如果我们按照相同的步骤进行:
 无符号128 =         10000000
取反所有位= 01111111
加1= 10000000
所以,-128和128在二进制补码表示法中具有相同的表示形式?为什么8位二进制补码的范围不是-127到128?简而言之,为什么-128比使用相同位数表示无符号128更受欢迎?

1
任何情况下都不推荐使用 8h。由于最高位被设置为1,它被认为是负数,非常简单明了。 - tay10r
3个回答

17

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

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

总共256个值,即2的8次方。

附录基于评论(和重新阅读问题)

0x80可以被认为是-128或+128。 建议参考维基百科解释

在该范围内的最小数的补码不会产生所需的取反效果。

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

在补码中,最负数有时被称为“奇怪的数字”,因为它是唯一的例外。尽管该数字是一个例外情况,但它在常规的补码系统中是一个有效的数字。 所有算术运算都可以将其作为操作数和(除非有溢出)结果来处理。

此外,将带符号整数向右移位会使CPU将最高位(第7位)传播到右边。如果 0x80 被认为是 +128,则这与简单逻辑相悖,因为仅进行一次移位后,我们将得到 0xC0,它是一个负数(-64)...... (而从正数右移位通常永远不会产生负结果)。

8

-128比128更受青睐,因为它符号位约定。在有符号数表示中,最高有效位被视为符号位。如果此位为1,则数字为负数。在表示128和-128(10000000)时,此位为1,因此意味着-128,而不是128。

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


同时,用除了0x0以外的任何东西来表示集合中唯一的零也有点傻。 - Humungus
很好的简短解释。我认为这个答案加上ring0的回答(由ollb进行编辑)适当地回应了我的问题。已点赞。谢谢。 - user720694

2
为了将MSB作为符号位。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接