【问题标题】:-128 and 128 in 2's complement2 的补码中的 -128 和 128
【发布时间】:2013-06-05 03:35:06
【问题描述】:

在 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 更受欢迎?

【问题讨论】:

  • 8h 无论如何都不是首选。由于设置了最高有效位,因此它被认为是负数、简单明了。

标签: binary twos-complement


【解决方案1】:

有符号字节中没有“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)...(而从正数右移通常永远不会产生负结果)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 而且还用除 0x0 以外的任何值表示集合中唯一的零有点愚蠢。
    • 很好的简短解释。我认为这个答案与 ring0 的答案(由 ollb 进行编辑)相结合,可以适当地回答我的问题。赞成。谢谢。
    【解决方案3】:

    为了保持MSB为符号位

    【讨论】:

      猜你喜欢
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 2019-01-29
      • 1970-01-01
      • 2011-08-06
      • 2011-04-13
      • 2018-03-15
      相关资源
      最近更新 更多