二进制减法

时间:2010-11-16 13:50:24

标签: assembly binary overflow subtraction

说我要减去: 0000 0000 - (-1)

即:(两个补充)

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

什么事情会发生,我的大脑现在真的和我在一起,它之前完全没问题,我认为它的溢出让我感到困惑,有人可以给我一些许可吗?)?

5 个答案:

答案 0 :(得分:6)

取减数的两个补码并将其加到minuend。

  0000 0000
- 1111 1111

 ...

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

将是(-11..11)。就像小数一样,符号仍然是符号,(0-x)仍然是(-x),除非你使用按位运算而不是普通减法。

答案 3 :(得分:0)

我的直觉告诉我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补码的思想是通过添加倒数来提供一种简单的减法方​​法。

答案 4 :(得分:0)

硬件的作用方式是它反转第二个操作数,并在最低有效位通道上进位到1进行加法。因此,add是一个add,其中进位为零,sub为添加操作数注释和进位集。

您可以使用铅笔和纸张样式,从旁边的数字借用,但与十进制数字相比,感觉有点傻。使用十进制数字表示1000减去1,右边的零变为10,因为这是10的基数,然后它旁边的0必须借用以使其成为10然后向右借一个使其成为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 1 0b10,底行保持为0 0 0 0 0 0 0 0,减去列,得到0 0 0 0 0 0 0 1。