说我要减: 0000 0000 - (-1)二进制减法
是:(两者相辅相成)
0000 0000
- 1111 1111
---------
= ???? ????
请告诉我要发生的事,我的脑子真的是他妈的*现在和我在一起,它之前完全没问题,我认为它的溢出让我感到困扰,有人可以给予一些清除:)?
说我要减: 0000 0000 - (-1)二进制减法
是:(两者相辅相成)
0000 0000
- 1111 1111
---------
= ???? ????
请告诉我要发生的事,我的脑子真的是他妈的*现在和我在一起,它之前完全没问题,我认为它的溢出让我感到困扰,有人可以给予一些清除:)?
取减数的二进制补码并将其加到被减数中。
0000 0000
- 1111 1111
...
0000 0000
+ 0000 0001
-----------
0000 0001
您可以通过加上1的二进制补码(二进制0000 0001)来减去-1(二进制1111 1111)。因此,在十进制中,0 - ( - 1)= 0 + 1 = 1 :-)
0 - 1 == -1;但如果你打算使用按位运算,那么0 - 1 == 1和10 - 1 == 11(二进制)。 – Vladimir 2010-11-16 13:57:20
它真的是第二个补充? -1 = 1111 1111二进制权限,所以你执行补码,加1并再次将两个数字加在一起吧? – 2010-11-16 13:57:45
@Dair:问题是0 - (-1) – 2010-11-16 13:58:21
它将是(-11..11)。就像小数点一样,符号仍然是符号,并且(0-x)仍然是(-x),除非您使用按位运算而不是简单减法运算。
我的直觉告诉我,0 - (-1)
应该等于0+1
,或者简单地说1
。
如果你想知道为什么,试图通过比特执行减法位:
0 - 1 = 10 - 1 = 1, setting borrow to 1.
0 - 1 - borrow = 10 - 1 - 1 = 0, borrow = 1
etc..
,更好的避免了手工做的二进制减法。二进制补码的思想是提供一种通过添加倒数来执行减法的简单方法。
硬件确实是它反转第二个操作数,并执行与增加携带的至少显著位通道的方式1。所以一个附加是与进位为零,并添加一个sub是一个加操作数notted和进位集。
你可以做它铅笔和纸的风格,你从旁边的数字借用,但它与十进制数字相比感觉有点愚蠢。用十进制数字表示1000减1,右边的零变为10,因为这是基数10,那么它旁边的0必须借以使它成为10,然后向右借出一个使其成为9,这个继续,直到你的第一行是9 9 10,然后你减去0 0 1并得到999.以基数2 0b1000(十进制8)减去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.
语言!!! – 2010-11-16 13:53:57
@精英绅士原谅他,递归很难:) – ruslik 2010-11-16 13:57:50
我说过请至少;) – Skeen 2013-09-05 14:12:45