【问题标题】:Binary subtraction二进制减法
【发布时间】:2010-11-16 13:50:23
【问题描述】:

假设我要减去: 0000 0000 - (-1)

即:(二补)

      0000 0000
    - 1111 1111
      ---------
    = ???? ????

会发生什么,我的大脑现在真的在和我在一起,之前一切正常,我认为是溢出让我搞砸了,有人可以澄清一下吗:)?

【问题讨论】:

  • @精英绅士原谅他,递归很难:)
  • 我说请至少;)

标签: assembly binary overflow subtraction


【解决方案1】:

取减数的补码并将其添加到被减数。

  0000 0000
- 1111 1111

 ...

  0000 0000
+ 0000 0001
-----------
  0000 0001

【讨论】:

    【解决方案2】:

    它将是 (-11..11)。就像在小数中一样,符号仍然是符号,并且 (0-x) 仍然是 (-x),除非您使用按位运算而不是简单的减法。

    【讨论】:

      【解决方案3】:

      您可以通过添加其二进制补码 1(二进制 0000 0001)来减去 -1(二进制 1111 1111)。因此,在十进制中,0-(-1)=0+1=1 :-)

      【讨论】:

      • 0 - 1 == -1;但如果您要使用按位运算,则 0 - 1 == 1 和 10 - 1 == 11(二进制)。
      • 真的是二补吗? -1 = 1111 1111 二进制正确,所以你执行补码,加 1 并再次将两个数字加在一起对吗?
      • @Dair:问题是 0 - (-1)
      • 哎呀,我刚刚了解到,在我的语言中,所谓的第二补码,实际上在英语中称为双补码。我会相应地编辑答案。网址en.wikipedia.org/wiki/Two%27s_complement
      【解决方案4】:

      硬件的做法是将第二个操作数取反,并在最低有效位通道上执行加法,进位为 1。因此,加法是进位为零的加法,而 sub 是加上未记录的操作数和进位。

      你可以用铅笔和纸的方式,从旁边的数字中借用,但与十进制数字相比,感觉有点傻。用十进制数说 1000 减 1 右边的 0 变成 10,因为这是以 10 为底,然后它旁边的 0 也必须借用使其成为 10,但然后将 1 借到右边使其成为 9,这继续直到你的第一行是 9 9 10 并且你减去 0 0 1 并得到 999。用底数 2 0b1000(十进制的八位)减去 0b0001,同样的事情发生在右边的零从左边借来变成 2 或 0b10,因为这是底数 2,它旁边的零也必须借用成为 0b10,然后将一个借到右边使其成为 1,依此类推,所以你的顶行是 1 1 0b10,底行是 0 0 1 减去列,你会得到 0b111 或 7 小数。

      所以全零减去全一,在第一次借位后顶行是 1 1 1 1 1 1 1 0b10,底行保持为 0 0 0 0 0 0 0 0,减去列,你得到 0 0 0 0 0 0 0 1.

      【讨论】:

        【解决方案5】:

        我的直觉告诉我 0 - (-1) 应该等于 0+1 ,或者只是 1 。

        如果你想知道为什么,试着一点一点地执行减法:

        0 - 1          = 10 - 1     = 1, setting borrow to 1.
        0 - 1 - borrow = 10 - 1 - 1 = 0, borrow = 1
        etc..
        

        最好避免手动进行二进制减法。 2s 补码的想法是通过添加倒数来提供一种执行减法的简单方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多