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