12

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

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

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

 无符号 1 = 00000001

 反转所有位 = 11111110

 加 1 = 11111111

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

 无符号 128 = 10000000

 反转所有位= 01111111

 加 1 = 10000000

所以 -128 和 128 在 2 的补码符号中具有相同的表示?为什么 8 位的 2 补码范围不是 -127 到 128?简而言之,为什么 -128 比使用相同位数表示无符号 128 更受欢迎?

4

3 回答 3

12

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

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

共有 256 个值,即 2^8。

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

0x80可能被认为是 -128 或 +128。维基百科解释值得一读

范围内最小数字的二进制补码不会产生取反数字的预期效果。

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

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

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

于 2013-06-09T08:03:22.647 回答
8

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

http://en.wikipedia.org/wiki/Sign_bit

于 2013-06-09T08:09:12.677 回答
2

In order to keep the MSB as the sign bit

于 2013-06-09T08:40:17.017 回答