假设 A
和 B
是有符号的正整数,那么对于 A-B
,它是使用 A+2
计算的B
的补码.
例如,在 4 位二进制系统中,对于有符号整数,我们有7-3=0111-0011=0111+1101=(1)0100
,
括号中的 1 是进位位。根据有符号整数的溢出规则,我们知道没有溢出,因此结果是正确的。
然而,对于无符号整数,如果我们计算 7-3
会发生什么?如果我们使用上面提到的相同方式:
7-3=0111-0011=0111+1101=(1)0100
然后,根据无符号整数的溢出规则,由于进位存在溢出。换句话说,
0100
是错误的,因为有溢出。但实际上,我们知道结果0100
是正确的。如果我的分析是正确的,使用加法器进行无符号整数减法是不是错了?
最佳答案
你的分析不正确。实际上取决于 CPU ALU 单元。 :)
在第一种情况下,您使用的是 4 位整数,但您忘记了 4 位符号整数的最高位是 签到 !所以你只检查进位和溢出状态,而不是 负 状态位。
在一般二元算术运算中 添加 和 子有符号整数和无符号整数相同。只有受影响的标志不同。
其实你必须考虑:
详细说明:
补函数的挖掘是取反,所以从正数取相反数,从负数取正数。我们可以通过两种方式进行二进制补码。让我们看看数字 3 的两种情况。
b'1101' + 随身携带 (进位是 设置 仅在 compl (0))
等于 b'0000' - b'0011' = b'1101' + 随身携带 (进位是 清除 仅在
复合 (0))
在第一种情况下,函数补码也对进位位进行补码,我们还有名为 borrow 的进位标志的第二种解释。 .
在第二种情况下,一切都清楚了。如果我们在补码处有进位(溢出),这意味着我们需要另一个溢出来规范减法的结果。
关于assembly - 加法器如何执行无符号整数减法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8053053/