如果从较小的数字中减去大数字,则需要借入。进位标志在减法运算期间起着借用的作用。 现在假设我们想从56中减去66,显然需要借用并设置进位标志。现在如何执行此减法以获得结果-10,计算机将如何区分结果将是负数。请解释一下这个过程。
答案 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)
进位标志与符号位不同。进位标志用于进行多部分算术,其中一次加法或减法的结果需要影响下一个更高的部分。
随着多年来寄存器大小的增加和汇编程序的逐渐减弱,你再也看不到这种情况了。