携带旗帜和减法问题

时间:2010-05-17 17:50:49

标签: assembly

如果从较小的数字中减去大数字,则需要借入。进位标志在减法运算期间起着借用的作用。 现在假设我们想从56中减去66,显然需要借用并设置进位标志。现在如何执行此减法以获得结果-10,计算机将如何区分结果将是负数。请解释一下这个过程。

5 个答案:

答案 0 :(得分:4)

通常,减法实现为否定,然后添加。因此,对于您的示例,CPU将在内部采用56并添加-66。在x86(或大多数其他现代处理器)上,否定将使用二进制补码,这意味着否定转换为“补充所有位,然后添加一个(并忽略任何执行)。”

    0011 1000
-   0100 0010
    ---------

第二个操作数转换如下:

complement bits: 1011 1101
Increment:       1011 1110

所以进行的操作是:

    0011 1000
+   1011 1110
--------------
=   1111 0110

此结果可以被视为246(作为无符号数字)或-10(作为有符号数字)。

答案 1 :(得分:3)

如果计算机使用的是2的补码,则计算机不需要。

让我们考虑一个更简单的例子,3 - 5:

    0011 = 3
-   0101 = 5
————————
    1110 = 14

结果为14,但在2的补码中,这也是-2的值。因此,如果代码使用签名类型,它将正确获得-2。否则,它将得到14.这完全取决于程序员如何编写代码。

答案 2 :(得分:1)

计算机不做减法。它会添加一个负数。

所以,56 - 66 = 56 +( - 66)

56 = 0x38(十六进制为38)

-66 = 0xFFFFFFBE(32位系统中0x42的补码)

如果你这样做会添加这些十六进制数字,你将得到0xFFFFFFF6,它是0xA的负补码,这是一个十进制数。

答案 3 :(得分:-1)

计算机不会区分这一点。电脑不关心标志,你和编译器一样。您将此值存储在signed变量中,然后将其用作signed。长数和负数之间没有语义差异。

答案 4 :(得分:-2)

进位标志与符号位不同。进位标志用于进行多部分算术,其中一次加法或减法的结果需要影响下一个更高的部分。

随着多年来寄存器大小的增加和汇编程序的逐渐减弱,你再也看不到这种情况了。