2.3 整数计算

2.3 整数计算

2.3.1 无符号加法

对于满足(0 leq x,quad y<2^w)的整数(x)(y)有:

[x +_{w}^{u} y=egin{cases} x+y,quad x + y < 2^w\ x + y - 2^w,quad 2^wleq x+y < 2^{w+1} end{cases} ]

检测无符号数加法中的溢出

对在范围(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)由下式给出:

[-_{w}^{u} x=egin{cases} x,quad x = 0\ 2^w - x,quad x > 0 end{cases} ]

  • 补码逆元

对满足(-2^{w-1}leq x leq 2^{w-1} - 1)的任意(x),其(w)位的无符号逆元(-_{w}^{t}x)由下式给出:

[-_{w}^{t} x=egin{cases} TMin_w,quad x = TMin_w\ - x,quad x > TMin_w end{cases} ]

2.3.2 补码加法

对于满足(-2^{w-1}leq x,quad y leq 2^{w-1} - 1)的整数(x)(y)有:

[x +_{w}^{t} y=egin{cases} x+y - 2^{w},quad x + y > 2^{w-1} - 1 qquad extrm{正溢出}\ x + y,qquad -2^{w-1}leq x+y leq 2^{w-1}-1 quad extrm{正常} \ x + y + 2^{w}, quad x + y < -2^{w-1} extrm{负溢出} end{cases} ]

两个数的(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)有:

[x*_w^uy=(x cdot y)mod(2^w) ]

2.3.5 补码乘法

对于满足(TMin_w leq x, y leq TMax_w)(x)(y)有:

[x*_w^ty=U2T_w((x cdot y)mod(2^w)) ]

对于无符号和补码乘法运算来说,乘法运算的位级表示都是一样的。

2.3.6 乘以常数
  • 与2的幂相乘的无符号乘法

[x<<k表示x*_w^u2^k ]

  • 与2的幂相乘的补码乘法

[x<<k表示x*_w^t2^k ]

由于整数乘法比移位和加法的代价大得多,所以许多c语言编译器试图以移位、加法和减法的组合来消除很多整数乘以常数的情况。

2.3.7 除以2的幂

无符号数和补码分别使用逻辑移位和算术移位来达到目的。整数除法总是向0方向舍入。

  • 除以2的幂无符号数除法,直接右移,向下取整

[x>>k等价于lfloor x/2^k floor ]

  • 补码直接算术右移,会使结果向下舍入,通过移位前添加偏置,使其向上舍入。

[(x+(1<<k)-1)>>k等价于lceil x/2^k ceil ]

原文地址:https://www.cnblogs.com/BigMario/p/14464485.html