2.3 整数计算

2.3 整数计算

2.3.1 无符号加法

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

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

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

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

\[-_{w}^{u} x=\begin{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=\begin{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=\begin{cases} x+y - 2^{w},\quad x + y > 2^{w-1} - 1 \qquad \textrm{正溢出}\\ x + y,\qquad -2^{w-1}\leq x+y \leq 2^{w-1}-1 \quad \textrm{正常} \\ x + y + 2^{w}, \quad x + y < -2^{w-1} \textrm{负溢出} \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 \rfloor \]

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

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

posted @ 2021-03-01 16:39  马里奥本奥  阅读(130)  评论(0编辑  收藏  举报