整型乘法

与加法类似,整型乘法也受固定位宽的限制,乘积的位数可能超出表示范围。

无符号数乘法

对于 位无符号数 ,乘积 最多需要 位来表示。

实际计算结果为截断高端 位后的低 位:

有符号数乘法

位级操作相同

有符号数乘法与无符号数乘法在硬件层面执行完全相同的操作:按位相乘后截断低 位。区别仅在于对结果的解释方式不同。

这意味着对于相同的位模式,无符号乘法和有符号乘法得到相同的低 位结果,但解释为整数值时可能不同。

溢出检测

有符号乘法溢出的检测稍微复杂:

int x, y, prod = x * y;
int overflow = (x != 0 && prod / x != y);

利用除法来验证乘积是否一致。

乘法的优化

移位替代乘法

对于乘以常数(尤其是2的幂次),编译器通常使用移位运算替代乘法,因为移位比乘法快得多。

  • x * 2x << 1
  • x * 8x << 3
  • x * 10(x << 3) + (x << 1) (8x + 2x)

无符号乘法的移位优化

乘以2的幂次相当于左移:

有符号乘法的移位优化

对于有符号数同样适用左移替代乘以2的幂次(注意符号位随之移动,但不会导致负权重问题,因为左移后低位补0,高位舍弃的逻辑与乘法一致)。

更一般的优化

对于任意常数 ,编译器可以将其分解为多个2的幂次之和:

然后使用多个移位和加法/减法组合来实现乘法:

x * 15 = x * (16 - 1) = (x << 4) - x
x * 30 = x * (32 - 2) = (x << 5) - (x << 1)

相关笔记

链接到