无符号加法怎样处理溢出?
- 对满足 0≤x,y<2w 的 x 和 y:
x+wuy={x+y,x+y−2w,x+y<2w2w≤x+y<2w+1
- 正常: 和未超出 w 位可表示范围;
- 溢出: 和超出 2w 时丢弃进位, 等价于对 2w 取模;
无符号数的逆元怎么求?
- 对满足 0≤x<2w 的 x:
−wux={x,2w−x,x=0x>0
- 结论: 无符号逆元就是 2w−x, 与补码 −x 的位模式完全相同;
补码加法怎样处理溢出?
- 对满足 −2w−1≤x,y≤2w−1−1 的 x 和 y:
x+wty=⎩⎨⎧x+y−2w,x+y,x+y+2w,2w−1≤x+y−2w−1≤x+y<2w−1x+y<−2w−1
- 正溢出: 结果减 2w, 得到一个大负数;
- 负溢出: 结果加 2w, 得到一个大正数;
补码的逆元怎么求?
- 对满足 TMinw≤x≤TMaxw 的 x:
−wtx={TMinw,−x,x=TMinwx>TMinw
- 特例: 最小值的逆元仍是自身, 因为 ∣TMinw∣=∣TMaxw∣+1;
无符号乘法和补码乘法的结果是什么?
x∗wuy=(x⋅y)mod2w
x∗wty=U2Tw((x⋅y)mod2w)
- 共同点: 都先算完整乘积再截断到 w 位;
- 推论: 两种乘法的位级结果相同, 只是解释方式不同;
编译器如何用移位实现乘除?
- 乘以 2 的幂: 左移, 右端补 0;
- 乘以任意常数: 乘法指令开销大, 编译器尝试用移位与加减的组合替代;
- 除以 2 的幂: 右移, 左端保留符号位或补 0;
- 结果: 无符号除法满足 x′=⌊x/2k⌋;