2.3 整数计算
2.3.1 无符号加法
对于满足(0 leq x,quad y<2^w)的整数(x)和(y)有:
检测无符号数加法中的溢出
对在范围(0 leq x,quad yleq 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)。该加法的逆操作表述如下:
- 无符号数逆元
对满足(0leq 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的幂无符号数除法,直接右移,向下取整
- 补码直接算术右移,会使结果向下舍入,通过移位前添加偏置,使其向上舍入。