繁体   English   中英

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

[英]Subtract larger number from smaller number (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)

谢谢

没有什么可借的,因此结果变为负数。

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

旁注:如果您使用的是Windows,则内置计算器可以帮助您在“程序员”视图中进行这些计算。

逻辑没有减法,加法是减法。 记住,补码是“取反并加1”。 当您进行十进制数学运算并添加99 + 3时,第一列为9 + 3 = 2携带1。被结转的数字进入顶部的一个载物位,第二列1(进位)加9(第一操作数)加0。 (第二个操作数的placholder)。 是0携带1,第三列是1 + 0 + 0 = 1携带零,我们可以称其为完成。 您可以可视化三行,进位,第一操作数和第二操作数。进位插槽在第一列上可用。 现在考虑二进制,您可以对带有列的二进制进行完全相同的数学运算(十六进制只是二进制,以四位为一组,如果要用铅笔和纸进行此操作,则会将十六进制分解为单个位)。 因此我们从学校知道a + b = a +(-b)对,并且我们知道在二进制-b中,二进制补码取反并加一个。 因此,如果您只是简单地将其取反并用作第二个操作数,并且第一列的进位插槽中的加号是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该怎么办? 左侧的填充为零。 没有借。 另一个数字是借来的,左边的进位是永远的。 或另一种思考方式是答案是否定的。 二进制中的负数1取反,然后向右加1,因此0x001取反是0xFFFFF ... FFFFE,其位数与alu或寄存器中的位数相同,然后加1并得到0xFFFF .... FFFF。 如果是8位寄存器0xFF,16位0xFFFF,32 0xFFFFFFFF。 与上面的0xFFFF ... FF6645相同。 将其反转,然后添加一个0x99BA + 1 = 0x99BB = 39355或实际上为-39355。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM