我正在尝试解决以下问题:
E8B2035D
-FB60528D
----------
其中,表示的整数是 32 位二进制补码二进制数的十六进制表示。解决此问题并检测溢出的最佳方法是什么?
我正在尝试解决以下问题:
E8B2035D
-FB60528D
----------
其中,表示的整数是 32 位二进制补码二进制数的十六进制表示。解决此问题并检测溢出的最佳方法是什么?
当您使用二进制补码时,减法变为加法。所以我会取第二个数字的补码,然后添加它们:
如您所知,数字的二进制补码从将每个 1 变为 0 开始,反之亦然(方便的经验法则:做 15 - 数字,因此 F -> 0、E -> 1、D -> 2 等) :
FB60528D --> 049FAD72
然后将数字加一(在这种情况下,2 + 1 = 3
,并且没有进位):
049FAD73 -- the two's complement of FB60528D
现在我们将数字相加,使用传统的加法规则:
E8B2035D
049FAD73 +
----------
D + 3 = 10 : write 0, carry 1
1 + 5 + 7 : write D, carry 0
3 + D = 10 : write 0, carry 1
1 + 0 + A : write B, carry 0
2 + F : write 1, carry 1
1 + B + 9 : write 5, carry 1
1 + 8 + 4 : write D, carry 0
E + 0 : write E
最终结果(仍然是二进制补码)是
ED51B0D0
如果最后一次计算导致进位(数字 > F
),您将检测到溢出。