我有两个积分变量a和b和恒定sRESP。d。我需要计算(a*b)>>sresp 的值。a*b/d。问题是,即使a*b/d可能适合给定的整数类型,乘法运算也可能溢出并且最终结果将不正确。
a
b
s
d
(a*b)>>s
a*b/d
如何有效地解决呢?的直接的解决方案是将可变扩大a或b为更大的整数类型,但也有可能不是一个较大的整数类型。有没有更好的方法来解决问题?
如果没有更大的类型,则要么需要找到一个大整数样式库,要么使用长乘法手动处理它。
例如,假设a和b是16位。然后,您可以将它们重写为a = (1<<8)*aH + aL和,b = (1<<8)*bH + bL(其中所有单个组件都是8位数字)。然后,您知道总体结果将是:
a = (1<<8)*aH + aL
b = (1<<8)*bH + bL
(a*b) = (1<<16)*aH*bH + (1<<8)*aH*bL + (1<<8)*aL*bH + aL*bL
这4个组件中的每个组件都适合一个16位寄存器。现在,您可以对每个单独的分量执行例如右移操作,请小心处理适当的进位。