RiscV 检查乘法期间是否发生溢出

问题描述 投票:0回答:1

使用这个算法来计算有符号整数的乘法(我们不能使用 mul、mulh 等,所以我用移位和加法实现了 mul),如何检查结果是否溢出。产品必须保持 32 位 enter image description here

我尝试使用一些溢出条件,例如(a * b = c):

  1. a > 0 且 b > 0 c < 0 this means the result has overflown.
  2. a < 0 and b < 0 c > 0 表示结果溢出。

但是,例如当 a = -3434421 和 b = -12555 时,程序无法理解它已经溢出。我想溢出的条件可能不正确。

multiplication riscv integer-overflow
1个回答
0
投票

看来你正在用 32 位进行这个算术。

但是两个 32 位数字相乘会产生 64 位结果(没有任何溢出的可能性)。

如果您只考虑答案的低 32 位,那么乘法就没有意义,因为有很多位被忽略。

这种查看低 32 位的方法仅适用于加法,之所以有效,是因为将两个 32 位数字相加会得到一个 33 位数字(没有任何溢出的可能性),因此将 33 位加法结果截断为32 位,我们仍然可以通过查看原始输入值来检测溢出。


要使用移位和加法方法检测乘法溢出,您必须在加法和左移以及每次迭代时检查溢出,然后尽早清除溢出或使溢出“粘性”,因此一旦设置它就可以设置它保持设置。


a < 0 and b < 0 c > 0 这意味着结果已经溢出

这个公式完全错误,因为 -1 × -1 = 1(所以 a<0, b<0, c>0),但这里没有溢出。

© www.soinside.com 2019 - 2024. All rights reserved.