2.3 整数计算
2.3 整数计算
2.3.1 无符号加法
对于满足\(0 \leq x,\quad y<2^w\)的整数\(x\)和\(y\)有:
检测无符号数加法中的溢出
对在范围\(0 \leq x,\quad y\leq UMax_x\)中的\(x\)和\(y\),令\(s \dot{=} x+_{w}^{u}y\)。则对计算结果s,当且仅当\(s < x\)(或者等价于\(s < y\))时,发生了溢出。
加法逆元
对于每个值\(x\),必然有其对应的加法逆元\(-_{w}^{u}x\)满足\(-_{w}^{u}x +_{w}^{u}x=0\)。该加法的逆操作表述如下:
- 无符号数逆元
对满足\(0\leq x < 2^w\)的任意\(x\),其\(w\)位的无符号逆元\(-_{w}^{u}x\)由下式给出:
- 补码逆元
对满足\(-2^{w-1}\leq x \leq 2^{w-1} - 1\)的任意\(x\),其\(w\)位的无符号逆元\(-_{w}^{t}x\)由下式给出:
2.3.2 补码加法
对于满足\(-2^{w-1}\leq x,\quad y \leq 2^{w-1} - 1\)的整数\(x\)和\(y\)有:
两个数的\(w\)位补码之和与无符号数之和有相同的位级表示。
检测补码加法中的溢出
对满足\(TMin_w \leq x, y \leq TMax_w\)的\(x\)和\(y\),令\(s \dot{=} x+_{w}^{t}y\),当且仅当\(x>0, y > 0\),但\(s \leq 0\)时,计算\(s\)发生了正溢出。当且仅当\(x < 0, y < 0\),但\(s \geq 0\)时,计算\(s\)发生了负溢出。
计算一个位级表示的值的补码非(加法逆元)的两种便捷方法:
- 对每一位求补(取反),再对结果加1。
- 找到位级表示最右边的1的位置,设为第k位,将位k左边的所有位取反。
2.3.4 无符号乘法
对于满足\(0 \leq x, y \leq UMax_x\)的\(x\)和\(y\)有:
2.3.5 补码乘法
对于满足\(TMin_w \leq x, y \leq TMax_w\)的\(x\)和\(y\)有:
对于无符号和补码乘法运算来说,乘法运算的位级表示都是一样的。
2.3.6 乘以常数
- 与2的幂相乘的无符号乘法
- 与2的幂相乘的补码乘法
由于整数乘法比移位和加法的代价大得多,所以许多c语言编译器试图以移位、加法和减法的组合来消除很多整数乘以常数的情况。
2.3.7 除以2的幂
无符号数和补码分别使用逻辑移位和算术移位来达到目的。整数除法总是向0方向舍入。
- 除以2的幂无符号数除法,直接右移,向下取整
- 补码直接算术右移,会使结果向下舍入,通过移位前添加偏置,使其向上舍入。