在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?
答案 0 :(得分:8)
有符号字节中没有“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.
答案 2 :(得分:1)
为了保持MSB为符号位