在这个对相关问题的回答中,C 中的示例代码显示了如何通过加法进行减法。该代码还设置了进位和溢出标志,并包含一个简单的“测试”,可以添加和减去一些数字并打印结果。数字是 8 位的。
编辑:正式证明可以使用 ADD 而不是 SUB 来处理无符号整数,并像从 SUB 一样发现无符号上溢/下溢。
假设我们要计算a - b
, wherea
和b
是 4 位无符号整数,我们希望通过加法执行减法并在a < b时获得 4 位差和下溢/上溢指示。
a - b = a + (-b)
因为我们在模 16 算术中操作,所以-b
= 16-b
。所以,
a - b = a + (-b) = a + (16 - b)
如果我们执行常规的无符号加法,a
并且16-b
这种加法的溢出条件(通常由 CPU 在其carry
标志中指示)将是这样的(回想一下,我们正在处理 4 位整数):
a + (16 - b) > 15
让我们简化这个溢出条件:
a + 16 - b > 15
a + 16 > 15 + b
a + 1 > b
a > b - 1
现在让我们回想一下,我们正在处理整数。因此,上面可以重写为:
a >= b。这是在添加and
之后得到进位标志 = 1 的条件。如果不等式不成立,我们得到进位 = 0。a
(16)-b
现在让我们回想一下,我们对减法 (a - b) 的上溢/下溢感兴趣。该条件是a < b。
好吧,a >= b与a < b完全相反。
由此可以得出carry
,您从加法中获得的标志a
是减法溢出的倒数(16)-b
,或者换句话说,是您通过使用适当的减法指令(例如 SUB)直接减去而获得的标志的倒数。borrow
b
a
只需反转进位或以相反的方式处理它。