1

这是一个基本问题,但假设我想将寄存器 $t2、$t3 和 $t4 中的 3 个数字相乘。假设每个寄存器只能容纳 8 位,当我们将三个数字相乘时,结果可能大于 8 位。如果它大于 8 位,如果每个寄存器只能保存 8 位,结果如何存储在寄存器 $t0 中?

4

3 回答 3

2

通常 CPU 有某种指令,可以将两个寄存器相乘,得到两倍大的结果,分布在多个寄存器中。这是实现扩展精度算术所必需的。

例如在 amd64 上,将两个 64 位数字相乘并得到 128 位结果,您可以这样做:

mov rax, qword ptr [t2]
mul qword ptr [t3]
; the result is now in rdx : rax
mov qword ptr [result], rax
mov qword ptr [result + 8], rdx

要将三个 64 位数字相乘并获得 192 位结果,您必须通过将上述相关部分相乘并将它们相加来实现扩展精度乘法。

于 2016-10-09T15:56:19.200 回答
0

在那种特定情况下,算术单元将设置一个溢出标志

于 2016-10-09T15:46:38.803 回答
0

诺霍。这就是众所周知的算术溢出

有时您可以更改运算符的顺序以避免这种溢出。Fe代替if (a + b > INT_MAX) ...你可以写if (a > INT_MAX - b) ...等等。

有时您应该使用int64代替int32,或double代替float

有时你应该使用像GMP这样的大数字库。

于 2016-10-09T15:49:53.453 回答