X = 01001001,Y = 10101010
如果我想将它们添加到一起,我该怎么做?他们是“两个补充”......
我尝试了很多东西但是我不太确定我得到了正确的答案,因为似乎有不同类型的规则。
只是想确保它是正确的:
1.添加它们,因为它们不会转换负数
2.转换你得到的负数,这就是总和
f.eks
01001001 + 10101010 = 11110011 => 00001100 => 1101 => -13
要么?
1.转换否定
2.将它们加在一起并转换为负数
f.eks
01001001 + 10101010 => 01001001 + 01010110 => 10011111 => 01100001 => -97
基本上我想做的是采取:X-Y和X + Y
有人可以告诉我该怎么做吗?
一些资源网站:
student-binary
celtickane
swarthmore
答案 0 :(得分:12)
两个补码的优点在于,在二进制级别,它是解释而不是算法 - 添加两个有符号数的硬件与无符号数相同(忽略标志位)。
你的第一个例子 - “只是添加它们” - 这是正确的答案。您的示例号码
所以,正确的答案确实是-13。
减法是一样的,因为两个补码数不需要特殊处理:你“只是减去它们”。
请注意,事情变得有趣的是溢出/下溢位的处理。您不能将73 - ( - 86)的结果表示为8位二进制补码数...
答案 1 :(得分:1)
当两个参数的符号相反时,添加二进制补码不需要任何特殊处理。你只需像往常一样以二进制形式添加它们,结果的符号就是你保留的符号。
答案 2 :(得分:1)
只是为了确保你理解两个补码,从正数转换为负数(反之亦然):反转每个位,然后在结果中加1。
例如,您的正数X = 01001001为负数,变为10110101 + 1 = 10110110;您的负数Y = 10101010变为01010101 + 1 = 01010110为正数。
要从X中减去Y,否定Y并添加。 I.E. 01001001 + 01010110。
答案 3 :(得分:1)
您的困惑可能是因为涉及的数字的宽度。为了更好地了解这一点,您可以尝试使用无符号整数创建有符号整数。
如果无符号整数的MSB已经为0,那么您可以将其读作签名并获得相同的结果。
如果MSB为1,则可以向左追加0以获得带符号的数字。您应该签名扩展(即,如果MSB为0则添加0,如果MSB为1则添加1)所有带符号的数字以获得相同宽度的数字,因此您可以“正常”执行算术。
例如,使用您的号码:
X = 01001001:无符号,MSB为0,什么都不做。
Y = 10101010:已签名,对X没有任何作用,仍然无所作为。
但是如果我们将X的MSB改为1:
X = 11001001:无符号,MSB为1,添加0 - > 011001001
Y = 10101010:有符号,扩展X,因此符号扩展Y - > 110101010
现在您有两个已签名的号码,您可以添加或减去您已知的方式。