X = 01001001 和 Y = 10101010
如果我想将它们加在一起,我该怎么做?它们是“Two's Complement”......我已经尝试了很多东西,但我不太确定我得到了正确的答案,因为似乎有不同类型的规则。
只是想确保它是正确的:
1. 按原样添加它们,不要转换负数
2. 转换你得到的负数,这就是总和。
f.eks 01001001
+10101010 = 11110011 => 00001100 => 1101 => -13
或者?
1.转换负数
2.将它们加在一起并转换负数
f.eks 01001001
+10101010 => 01001001 + 01010110 => 10011111 => 01100001 => -97
所以基本上我想做的就是取:XY和X +Y
有人可以告诉我该怎么做吗?
一些资源网站:
学生二进制
celtickane
swarthmore
4 回答
二进制补码的美妙之处在于,在二进制级别上,这是一个解释问题而不是算法问题 - 添加两个有符号数的硬件与无符号数的硬件相同(忽略标志位)。
您的第一个示例 - “只需添加它们” - 正是正确的答案。您的示例数字
- 01001001 = 73
- 10101010 = -86
所以,正确答案确实是-13。
减法是一样的,因为二进制补码不需要特殊处理:你“只是减去它们”。
请注意,有趣的地方是上溢/下溢位的处理。您不能将 73 - (-86) 的结果表示为 8 位二进制补码数......
当两个参数的符号相反时,添加二进制补码不需要任何特殊处理。您只需像往常一样在二进制中添加它们,结果的符号就是您保留的符号。
并且只是为了确保您理解二进制补码,将正数转换为负数(反之亦然):反转每个位,然后将结果加 1。
比如你的正数 X = 01001001 变成 10110101+1=10110110 为负数;您的负数 Y = 10101010 变为 01010101+1=01010110 作为正数。
要从 X 中减去 Y,请将 Y 取反并加。即 01001001 + 01010110。
您的困惑可能是因为所涉及数字的宽度。为了更好地了解这一点,您可以尝试从无符号整数中创建一个有符号整数。
如果您的无符号整数的 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
现在你有两个有符号的数字,你可以用你已经知道的方式加减。