2.3.1 Unsigned Addition
问题引入
对于两个宽度为w-bit的无符号数x、y,有0≤x,y<2w0 \leq x,y < 2^{w}0≤x,y<2w;
但如果计算这两个数的和,会发现:0≤x+y≤2w+1−20 \leq x+y \leq 2^{w+1} - 20≤x+y≤2w+1−2,表示这个和需要w+1 bit,如下图所示。
我们将这个和截断 为 w-bit,并将其视作一个无符号数,记作+wu+^u_w+wu
无符号数加法
公式
对于无符号数x、y,如果0≤x,y<2w0 \leq x,y < 2^{w}0≤x,y<2w,则有:
x+wuy={x+y,x+y<2w(Normal)x+y−2w,2w≤x+y<2w+1(Overflow)(无符号数加法-公式1)
x +^u_w y =
\begin{cases}
x + y, & x + y < 2^w(Normal) \\
x + y - 2^w, & 2^w \leq x + y < 2^{w+1}(Overflow)
\end{cases}
\tag{无符号数加法-公式1}
x+wuy={x+y,x+y−2w,x+y<2w(Normal)2w≤x+y<2w+1(Overflow)(无符号数加法-公式1)
该公式可以统一为:
x+wuy=(x+y) mod 2w(无符号数加法-公式2)
x +^u_w y = (x + y) \ mod \ 2^w
\tag{无符号数加法-公式2}
x+wuy=(x+y) mod 2w(无符号数加法-公式2)
推导
如果x+y<2wx + y < 2^wx+y<2w,那么得到的w+1 bit的和的最高位为0,将这个和截断为w-bit并不影响它的值;
如果2w≤x+y<2w+12^w \leq x + y < 2^{w+1}2w≤x+y<2w+1,那么得到的w+1 bit的和的最高位为0,将这个和截断为w-bit时,需要舍弃最高位的1,即减2w(或mod 2w)
溢出检测
溢出
如果算术运算的结果无法适应数据类型的字长限制时,被称之为溢出。
由于C语言对于溢出并不会提示错误信息,因此需要一些方法来检测是否发生溢出。
方法
对于0≤x,y<UMaxw0 \leq x,y < UMax_w0≤x,y<UMaxw,定义$ s \doteq x +^u_w y$;
则有: s 溢出,当且仅当$ s < x 或 s < y$,即s小于x或y中的任意一个
推导
$$
\because s 溢出 \
\therefore s = x + y - 2^w \
\because y < 2^w \
\therefore y - 2^w < 0 \
\therefore s = x + y - 2^w < x
\tag{溢出检测-推导}
$$
Modular addition
阿贝尔群
- 可交换、连续
- 有一个确定的元素0,并且每个元素都有一个加性逆(additive inverse)
公式
对于任意的0≤x<2w0 \leq x < 2^w0≤x<2w,x的无符号负数(加性逆)为:
−wu={x,x=02w−x,x>0(Modular addition-公式)
-^u_w =
\begin{cases}
x, & x = 0 \\
2^w -x, & x>0
\end{cases}
\tag{Modular addition-公式}
−wu={x,2w−x,x=0x>0(Modular addition-公式)
推导
- x = 0时,其加性逆明显为0
- 当x > 0时,对于2w−x2^w-x2w−x,有0<2w−x<ww0 < 2^w -x < w^w0<2w−x<ww;并且(x+2w−x) mod 2w=2w mod 2w=0(x + 2^w - x) \ mod \ 2^w = 2^w \ mod \ 2^w = 0(x+2w−x) mod 2w=2w mod 2w=0
2.3.2 Two’s-Complement Addition
问题引入
与无符号数的加法一样,在进行有符号数的加法时,我们也需要考虑运算的结果是否会太大或太小。
对于−2w−1≤x,y≤2w−1−1-2^{w-1} \leq x, y \leq 2^{w-1} -1−2w−1≤x,y≤2w−1−1,它们的和的范围为−2w≤x+y≤2w−1-2^w \leq x+y \leq 2^w -1−2w≤x+y≤2w−1,这个运算的结果需要w + 1 bit才能完全表示。
我们将这个和截断 为w-bit,视作有符号数,记作+wt+^t_w+wt
有符号数加法
公式
对于−2w−1≤x,y≤2w−1−1-2^{w-1} \leq x, y \leq 2^{w-1} -1−2w−1≤x,y≤2w−1−1:
x+wty={x+y−2w,2w−1≤x+y(PositiveOverflow)x+y,−2w≤x<2w−1(Normal)x+y+2w,x+y<−2w(NegativeOverflow)(有符号数加法-公式)
x +^t_w y =
\begin{cases}
x + y - 2^w, & 2^{w-1} \leq x + y(Positive Overflow) \\
x + y, & -2^w \leq x < 2^{w-1} (Normal) \\
x + y + 2^w, & x + y < -2^w(Negative Overflow)
\end{cases}
\tag{有符号数加法-公式}
x+wty=⎩⎨⎧x+y−2w,x+y,x+y+2w,2w−1≤x+y(PositiveOverflow)−2w≤x<2w−1(Normal)x+y<−2w(NegativeOverflow)(有符号数加法-公式)
推导
原理
由于有符号数的加法与无符号数的加法在bit层级的表示是一样的;
因此,在计算+wt+^t_w+wt时,可以按如下步骤进行操作:
- 将运算数转为无符号数
- 执行无符号数的加法
- 将结果转为有符号数
即x+wty=U2Tw(T2Uw(x)+wuT2Uw(y))x +^t_w y = U2T_w(T2U_w(x) +^u_w T2U_w(y))x+wty=U2Tw(T2Uw(x)+wuT2Uw(y))
推导过程
x+wty=U2Tw(T2Uw(x)+wuT2Uw(y))∵T2Uw(x)=xw−12w+x=U2Tw[(xw−12w+x+yw−12w+y) mod 2w]∵x+wuy=(x+y) mod 2w=U2Tw[(x+y) mod 2w]∵xw−1 mod 2w=0(有符号数加法-推导) \begin{aligned} x +^t_w y &= U2T_w(T2U_w(x) +^u_w T2U_w(y)) & \because T2U_w(x) = x_{w-1}2^w + x \\ &= U2T_w[(x_{w-1}2^w + x + y_{w-1}2^w +y) \ mod \ 2^w] & \because x +^u_w y = (x + y)\ mod \ 2^w \\ &= U2T_w[(x + y) \ mod \ 2^w] & \because x_{w-1} \ mod \ 2^w = 0 \end{aligned} \tag{有符号数加法-推导} x+wty=U2Tw(T2Uw(x)+wuT2Uw(y))=U2Tw[(xw−12w+x+yw−12w+y) mod 2w]=U2Tw[(x+y) mod 2w]∵T2Uw(x)=xw−12w+x∵x+wuy=(x+y) mod 2w∵xw−1 mod 2w=0(有符号数加法-推导)
4种情况
预备知识:
- TMaxw≐∑i=0w−22i=2w−1−1TMax_w \doteq \sum_{i=0}^{w-2}{2^i} = 2^{w-1} -1TMaxw≐∑i=0w−22i=2w−1−1
U2Tw(u)={u,u≤TMaxu−2w,u>TMax(U2Tw) U2T_w(u) = \begin{cases} u, & u \leq TMax \\ u-2^w, & u > TMax \end{cases} \tag{$U2T_w$} U2Tw(u)={u,u−2w,u≤TMaxu>TMax(U2Tw)
做如下定义:
z≐x+y,z′≐z mod 2w,z′′≐U2Tw(z′)z \doteq x +y,z' \doteq z \ mod \ 2^w ,z'' \doteq U2T_w(z')z≐x+y,z′≐z mod 2w,z′′≐U2Tw(z′),即z′′=x+wtyz'' = x +^t_w yz′′=x+wty
那么会有以下4种情况,与图片对应:
对应图中Case | z的范围 | z’的范围 | z’'的范围 |
---|---|---|---|
1 | −2w≤z<−2w−1-2^w \leq z < -2^{w-1}−2w≤z<−2w−1 | ∵z′=z+2w\because z' = z + 2^w∵z′=z+2w ∴0≤z′<−2w−1+2w=2w−1\therefore 0 \leq z' < -2^{w-1} + 2^w = 2^{w-1}∴0≤z′<−2w−1+2w=2w−1 | z′′=z′=z+2wz'' = z' = z + 2^wz′′=z′=z+2w |
2 | −2w−1≤z<0-2^{w-1} \leq z < 0−2w−1≤z<0 | ∵z′=z+2w\because z' = z + 2^w∵z′=z+2w ∴−2w−1+2w=2w−1≤z′<2w\therefore -2^{w-1} + 2^w = 2^{w-1} \leq z' < 2^w∴−2w−1+2w=2w−1≤z′<2w | z′′=z′−2w=z+2w−2w=zz'' = z' - 2^w = z + 2^w - 2^w = zz′′=z′−2w=z+2w−2w=z |
3 | 0≤z<2w−10\leq z <2^{w-1}0≤z<2w−1 | z′=zz' = zz′=z | z′′=z′=zz'' = z' = zz′′=z′=z |
4 | 2w−1≤z<2w2^{w-1} \leq z < 2^w2w−1≤z<2w | z′=zz' = zz′=z | z′′=z′−2wz'' = z' - 2^wz′′=z′−2w |
溢出检测
方法
对于TMinw≤x,y≤TMaxwTMin_w \leq x,y \leq TMax_wTMinw≤x,y≤TMaxw,定义s≐x+wtys \doteq x +^t_w ys≐x+wty,则其溢出检测为:
- 正溢出(positive overflow):当且仅当 x > 0 并且 y > 0,但s≤0s \leq 0s≤0时
- 负溢出(negative overflow):当且仅当 x < 0 并且 y < 0,但s≥0s \geq 0s≥0 时
图例
2.3.3 Two’s-Complement Negation
公式
对于TMinw≤x≤TMaxwTMin_w \leq x \leq TMax_wTMinw≤x≤TMaxw,存在对于+wt+^t_w+wt的加性逆,记作−wt-^t_w−wt,有:
−wtx={TMinw,x=TMinw−x,x>TMinw(Two’s-Complement Negation-公式)
-^t_wx =
\begin{cases}
TMin_w, & x = TMin_w \\
-x, & x > TMin_w
\end{cases}
\tag{Two’s-Complement Negation-公式}
−wtx={TMinw,−x,x=TMinwx>TMinw(Two’s-Complement Negation-公式)
推导
- 当x=TMinwx = TMin_wx=TMinw时:
∵TMinw+TMinw=−2w−1+(−2w−1)=−2w∴发送负溢出∴TMinw+wtTMinw=−2w+2w=0(Two’s-Complement Negation-推导) \because TMin_w + TMin_w = -2^{w-1} + (-2^{w-1}) = -2^w \\ \therefore 发送负溢出 \\ \therefore TMin_w +^t_w TMin_w = -2^w + 2^w = 0 \tag{Two’s-Complement Negation-推导} ∵TMinw+TMinw=−2w−1+(−2w−1)=−2w∴发送负溢出∴TMinw+wtTMinw=−2w+2w=0(Two’s-Complement Negation-推导)
- 当x>TMinwx > TMin_wx>TMinw 时,-x能被表示为一个w-bit的有符号数。
bit表示
方法一
方法
求出有符号数的反码,再将其加一。
在C语言中,-x
和~x + 1
具有相同的值
示例
方法二
方法
将有符号数分成两部分:
记k为最右侧的值为1的bit位置,则x⃗=[xw−1,xw−2,...,xk+1,1,0,...,0](x≠0)\vec{x} = [x_{w-1}, x_{w-2}, ..., x_{k+1}, 1, 0, ..., 0](x \neq 0)x=[xw−1,xw−2,...,xk+1,1,0,...,0](x=0);
则有符号数的加性逆为−wtx=[∼xw−1,∼xw−2,...,∼xk+1,1,0,...,0]-^t_wx = [\sim x_{w-1}, \sim x_{w-2}, ..., \sim x_{k+1}, 1, 0, ..., 0]−wtx=[∼xw−1,∼xw−2,...,∼xk+1,1,0,...,0]
示例
实例中,最右侧的值为1的bit标为斜体
2.3.4 Unsigned Multiplication
问题引入
对于w-bit的无符号整数x,y,有0≤x,y≤2w−1−10 \leq x,y \leq 2^{w-1} -10≤x,y≤2w−1−1;
它们的乘积的范围是:0≤x×y≤(2w−1−1)2=22w−2w+1+10 \leq x \times y \leq (2^{w-1} -1)^2 = 2^{2w} -2^{w+1} + 10≤x×y≤(2w−1−1)2=22w−2w+1+1,需要2w-bit来表示。
在C语言中进行无符号数的乘法时,会将生产的2w-bit的乘积截取低w-bit来做为运算结果,将截断后的结果记作x∗wuyx *^u_w yx∗wuy
截取低w-bit的方法是将乘积模上2w
公式
对于0≤x,y≤UMax0 \leq x,y \leq UMax0≤x,y≤UMax:
x∗wuy=(x×y) mod 2w(无符号数乘法-公式)
x *^u_w y = (x \times y) \ mod \ 2^w
\tag{无符号数乘法-公式}
x∗wuy=(x×y) mod 2w(无符号数乘法-公式)