多字数字的有符号算术?

时间:2014-08-24 00:59:11

标签: binary signed

假设我有一个4位ALU,我有一个进位标志,溢出标志和一个符号标志(MSB)。我如何减去例如两个带符号的8位数?我取两个数字的低半字节并正确地减去它们,但我不明白如何知道是否需要第5位,并将其转移到数字的高半字节的LSB,如果是,如何添加它考虑到我在2的补码这样做,所以我已经使用了Carryin ..任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

这里已多次询问和回答。

你知道关于二人的规则补充是吗?反转并添加一个。也来自小学

a + b = a + (-b).   

我们没有减去我们添加硬件的硬件。你做的是+( - b)。同样从小学我们学习了携带,9 + 3 = 2携带1.从第二列我们有两个或三个操作数加在一起(a +( - b)+ c,c是进位)。如果你考虑一下,我们可以在每一列都有一个进位,有时它是零。这就是硬件如何工作,每列三进二出,进入[n],a [n],b [n]输出结果为[n]并执行[n]。正如我们从小学了解到的那样,本专栏的内容是下一栏的内容。因此对于正常加法,最低有效位的进位始终为零,但是对于减法,我们要反转并加一,因此我们所做的是反转b并将第一位的进位更改为1,即与

相同
a + (~b) + 1 which equals a + (-b) which equals a - b.

就加法和减法硬件而言,没有签名或无符号加法或减法。确实存在无符号溢出(执行msbit)和有符号溢出(如果进位和执行msbit不相同则为true,如果匹配则为false)。

这适用于任意数量的位,例如,如果您有8位硬件但想要对256位数进行数学运算,则一次只执行8位并将执行应用于下一位8位(添加时)借入指令进行或减去)。一次可视化一列,4位只是这些列中的四列,8位,9位37位等。您可以轻松地将任何较大的数字绘制成垂直线,将其分成两个操作你为单列做的是右边的msbit的执行成为分界线左边的东西的lsbit的进位。使用4位硬件将其应用于8位数学...

因此,减法是一个加载,其中进位为1,第二个操作数被反转。现在有些硬件在减法时反转进位(无符号溢出),因此对于借位变为1而对于不借用变为0(无符号借位/溢出)。有些不。因此,如果你没有使用借用指令减去,你必须知道它是如何工作的。如果你有一个借位减法,如果它们反转执行无关紧要,它们将一般地反转进位(在减法上)。如果他们不再那么他们就不会借用借方减去。但是如果你必须使用带有进位的加法来模拟带有借位的减法,你可能不仅需要反转第二个操作数而是反转进位。如果你没有携带附加物,那么你必须通过简单地添加1来模拟它。