整型乘法
与加法类似,整型乘法也受固定位宽的限制,乘积的位数可能超出表示范围。
无符号数乘法
对于 位无符号数 和 ,乘积 最多需要 位来表示。
实际计算结果为截断高端 位后的低 位:
有符号数乘法
位级操作相同
有符号数乘法与无符号数乘法在硬件层面执行完全相同的操作:按位相乘后截断低 位。区别仅在于对结果的解释方式不同。
这意味着对于相同的位模式,无符号乘法和有符号乘法得到相同的低 位结果,但解释为整数值时可能不同。
溢出检测
有符号乘法溢出的检测稍微复杂:
int x, y, prod = x * y;
int overflow = (x != 0 && prod / x != y);利用除法来验证乘积是否一致。
乘法的优化
移位替代乘法
对于乘以常数(尤其是2的幂次),编译器通常使用移位运算替代乘法,因为移位比乘法快得多。
x * 2→x << 1x * 8→x << 3x * 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)相关笔记
链接到
- 上一个知识点:2.6 整型加法
- 下一个知识点:2.8 内存指针与字符串