从较小的数字(十六进制)中减去较大的数字

时间:2014-09-02 22:57:19

标签: assembly hex subtraction

我正在为系统编号做一些练习问题。一切都运行良好,但我遇到了一个问题,我在Hex系统中从较小的数字中减去较大的数字(基数为16)

(1234 - ABEF)我开始这样做了;

4 - F = 5 (borrow 16 from 3 so it becomes 2)
2 - E = 4 (borrow 16 from 2 so it becomes 1)
1 - B = 6 (borrow 16 from 1 so it becomes 0)
0 - A = ?   I don't know what to do here ? where should I borrow from ?

我使用了在线计算器,它告诉我最终的答案是 (1234 - ABEF = FFFF6645)

谢谢

2 个答案:

答案 0 :(得分:1)

没有什么可借用的,所以结果变成了负面的。

您使用的在线计算器的假设是您正在处理32位有符号值,并且由于您从较小的数字中减去更大的数字,因此从1234减去ABEF并变为FFFF6645,即小数-39355。

附注:如果你在Windows上,内置计算器可以帮助你在"程序员"图。

答案 1 :(得分:0)

逻辑没有减法,减法是通过加法完成的。记住,两个补充,"反转并添加1"。当你进行十进制数学运算并添加99 + 3时,第一列是9 + 3 = 2进位1.结转的数字进入顶部的进位槽,第二列1(进位)加9(第一个操作数)加0 (第二操作数的placholder)。是0携带1第三列是1 + 0 + 0 = 1携带零,我们可以调用它完成。你可以看到三行,进位,第一个操作数,第二个操作数。进位槽在第一列可用。现在想二进制,你可以用二进制二进制完全相同的数学运算(十六进制只是二进制,四位组,如果你用铅笔和纸做这个,你会把十六进制分成单独的位)。所以我们从学校知道a + b = a +( - b)对,我们知道二进制-b是二进制补码是反转并加一。那么如果你只是简单地反转并将其用作第二个操作数,并且第一列的进位槽中的加1是1,那么0x1234 - 0xABEF与0x1234 +(-0xABEF)= 0x1234 +相同( ~0xABEF)+ 1 = 0x01234 +(~0x0ABEF)+ 1(添加了一些填充)= 0x01234 + 0xF5410 + 1 = 0xF6645。或者如果你想将它修剪为16位,那么它是0x6645。如果你正在做32位,那么它是0xFFFF6645,64位0xFFFFFFFFFFFF6645。就像十进制99 + 3 = 100或0100或00000000100一样,具体取决于我们想要填充数字的位置。

如果我们做了0x1234 - 0x0005 = 0x01234 + 0xFFFFA + 1 = 0x01224怎么办?左边的填充是零。没有借款。另一个数字是借用,左边的执行是永远的。或者另一种思考方式是答案是消极的。二进制中的负一个是反转并加一个,所以0x001反转为0xFFFFF ... FFFFE为你的alu或寄存器中的多少位,然后加一个得到0xFFFF .... FFFF。如果它是一个8位寄存器0xFF,16位0xFFFF,32 0xFFFFFFFF。与上面的0xFFFF ... FF6645相同。反转并添加一个0x99BA + 1 = 0x99BB = 39355或实际-39355。

0x1234 = 4660,0xABEF = 44015,在计算器4460上 - 44015 = -39355。