小编典典

避免整数乘法后除法溢出

algorithm

我有两个积分变量ab和恒定sRESP。d。我需要计算(a*b)>>sresp
的值。a*b/d。问题是,即使a*b/d可能适合给定的整数类型,乘法运算也可能溢出并且最终结果将不正确。

如何有效地解决呢?的直接的解决方案是将可变扩大ab为更大的整数类型,但也有可能不是一个较大的整数类型。有没有更好的方法来解决问题?


阅读 320

收藏
2020-07-28

共1个答案

小编典典

如果没有更大的类型,则要么需要找到一个大整数样式库,要么使用长乘法手动处理它。

例如,假设ab是16位。然后,您可以将它们重写为a = (1<<8)*aH + aL和,b = (1<<8)*bH + bL(其中所有单个组件都是8位数字)。然后,您知道总体结果将是:

(a*b) = (1<<16)*aH*bH
      + (1<<8)*aH*bL
      + (1<<8)*aL*bH
      + aL*bL

这4个组件中的每个组件都适合一个16位寄存器。现在,您可以对每个单独的分量执行例如右移操作,请小心处理适当的进位。

2020-07-28