说我要减去: 0000 0000 - (-1)
即:(两个补充)
0000 0000
- 1111 1111
---------
= ???? ????
什么事情会发生,我的大脑现在真的和我在一起,它之前完全没问题,我认为它的溢出让我感到困惑,有人可以给我一些许可吗?)?/ p>
答案 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。