使用6位的1和2的补码表示法,我试图解决以下问题:
12 - 7 现在,我先取12的二进制和7的二进制。
12 = 001100 - 6 bit
7 = 000111 - 6 bit那么,我会不会把二的补码位翻过来加一呢?
12 = 110011 ones complement
+ 1
-------
001101
7 = 111000 ones complement
+ 1
---------
111001然后,将这两个补码相加
001101
+111001
-------
1000110 = overflow? discard the last digit? If so I get 5现在,如果我有像这样的数字
-15 + 2然后我会在MSB上添加一个符号幅度,如果它是零?
像这样:
-15 = 001111 6 bit在翻转比特之前,我会在这里的末尾添加一个1吗?
= 101111发布于 2010-10-07 09:43:20
使用二的补码来表示负值的好处是减法和加法是相同的。在您的例子中,您可以将12 - 7视为12 + (-7)。因此,您只需要找到-7的2的补码表示,并将其添加到+12:
12 001100
-7 111001 -- to get this, invert all bits of 7 (000111) and add 1
----------
5 1000101然后丢弃进位(表示溢出),您得到的结果是:000101,正如预期的那样等于5。
对于您的-15 + 2示例,只需按照相同的过程获得-15的两个补码表示:
15 001111
110000 -- inverted bits
110001 -- add 1现在像往常一样做加法:
-15 110001
2 000010
-----------
res 110011要查看res是否确实等于-13,您可以看到它是负的(MSB设置)。对于幅度,转换为正(反转比特,加1):
res 110011
001100 -- inverted bits
001101 -- add 1因此,正如预期的那样,震级为13级。
发布于 2010-10-07 09:24:11
不是的。2的补码算法不会因为负值的位置而改变。
https://stackoverflow.com/questions/3878062
复制相似问题