【问题标题】:Why does subtracting a negative 8-bit value from the 9-bit pattern 100000000 give the magnitude?为什么从 9 位模式 100000000 中减去负 8 位值会给出幅度?
【发布时间】:2016-11-07 22:17:53
【问题描述】:

我的教科书对有符号整数的补码方法给出如下解释:

我们将讨论这个方法,因为它适用于一个 1 字节的值。在那里面 上下文中,值 0 到 127 由最后 7 位表示, 高位设置为 0。到目前为止,这与 符号幅度法。此外,如果高位为 1,则值为 消极的。不同之处在于确定它的价值 负数。减去位模式 对于 9 位模式中的负数 100000000(256 为 以二进制表示),和 结果就是值的大小。

这对我来说毫无意义。典型的处理器使用八位字节(8 位字节)。 9位字节减去8位字节是什么意思?

【问题讨论】:

  • 还有更多信息here
  • 这与 C 无关。两个补码方法的想法是能够根据第一位写入有符号数。例如,如果您的字节为 11111111,则表示它是负数,相反,如果它是 01111111,则表示它是正数。在上面由@user3386109 提供的链接上阅读更多信息
  • “减法”是指数学中这个词的正常定义……不知道你对什么感到困惑。例如。 256 - 251 = 5,所以二进制补码中的 -5 与 +251 表示相同
  • 这只是普通的算术。从 9 位值中减去 8 位值的结果将再次适合 8 位。
  • 是的,了解binary numbersbinary arithmetic 是第一步。

标签: c twos-complement


【解决方案1】:

基本上,为了高效计算,您希望以相同的方式执行相同的操作(加法、减法等),而不考虑符号。所以首先,考虑无符号字节的情况。

使用 8 位,您可以表示 0-255 之间的任何值。加法和减法的工作方式与往常一样(模 256),一切都很好。

现在,想象一下,当您处于 127 时,增加 1 会得到 -128。我们仍在计算模 256,但前 128 个数字已经移动了 256。现在,让我们来看看加法: 10 + (-5) = 10 + 251(无符号)= 261 = 5(模 255)。

一切都按预期进行。所以,在我们的新表示中,-128 是 127 + 1,即 01111111 + 1,即 10000000。-1 将是 11111111。我希望我有所帮助。

【讨论】:

    【解决方案2】:

    你有 1 个字节(8 位数字,每个数字是 0 或 1)

    2 的补码通过查看第一个数字来起作用

    10010011
    ^ this one
    

    如果为0,则为正数,可以继续正常将二进制转十进制。

    如果为 1,则为负数。正常转换(bin(10010011) = 147)然后减去 256(147 - 256 = -109),就有了你的 2 的补码。

    【讨论】:

    • 这更有意义。我的书给出了以下示例:100000000−10000000 = 10000000。不过,这在数学上是错误的。
    • @ThePointer 很高兴我能帮上忙。如果您认为这是一个答案,请继续并单击绿色复选标记;)
    • @ThePointer——它在数学上不是错误的;这是二进制减法。
    • @DavidBowling 这一定是我的误解所在。谢谢,大卫。
    【解决方案3】:

    我对二进制补码的记忆说:

    “翻转位加一”

    确实,以下是负数:

    int i, j= 127;
    i = (~j)+1;
    printf ("%d\n",i); // prints -127
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多