2.3.1 Unsigned Addition
问题引入
对于两个宽度为w-bit的无符号数x、y,有 0 ≤ x , y < 2 w 0 \leq x,y < 2^{w} 0≤x,y<2w;
但如果计算这两个数的和,会发现: 0 ≤ x + y ≤ 2 w + 1 − 2 0 \leq x+y \leq 2^{w+1} - 2 0≤x+y≤2w+1−2,表示这个和需要w+1 bit,如下图所示。
我们将这个和截断 为 w-bit,并将其视作一个无符号数,记作 + w u +^u_w +wu
无符号数加法
公式
对于无符号数x、y,如果
0
≤
x
,
y
<
2
w
0 \leq x,y < 2^{w}
0≤x,y<2w,则有:
x
+
w
u
y
=
{
x
+
y
,
x
+
y
<
2
w
(
N
o
r
m
a
l
)
x
+
y
−
2
w
,
2
w
≤
x
+
y
<
2
w
+
1
(
O
v
e
r
f
l
o
w
)
(无符号数加法-公式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
+
w
u
y
=
(
x
+
y
)
m
o
d
2
w
(无符号数加法-公式2)
x +^u_w y = (x + y) \ mod \ 2^w \tag{无符号数加法-公式2}
x+wuy=(x+y) mod 2w(无符号数加法-公式2)
推导
如果 x + y < 2 w x + y < 2^w x+y<2w,那么得到的w+1 bit的和的最高位为0,将这个和截断为w-bit并不影响它的值;
如果 2 w ≤ x + y < 2 w + 1 2^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 < U M a x w 0 \leq x,y < UMax_w 0≤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
<
2
w
0 \leq x < 2^w
0≤x<2w,x的无符号负数(加性逆)为:
−
w
u
=
{
x
,
x
=
0
2
w
−
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时,对于 2 w − x 2^w-x 2w−x,有 0 < 2 w − x < w w 0 < 2^w -x < w^w 0<2w−x<ww;并且 ( x + 2 w − x ) m o d 2 w = 2 w m o d 2 w = 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
问题引入
与无符号数的加法一样,在进行有符号数的加法时,我们也需要考虑运算的结果是否会太大或太小。
对于 − 2 w − 1 ≤ x , y ≤ 2 w − 1 − 1 -2^{w-1} \leq x, y \leq 2^{w-1} -1 −2w−1≤x,y≤2w−1−1,它们的和的范围为 − 2 w ≤ x + y ≤ 2 w − 1 -2^w \leq x+y \leq 2^w -1 −2w≤x+y≤2w−1,这个运算的结果需要w + 1 bit才能完全表示。
我们将这个和截断 为w-bit,视作有符号数,记作 + w t +^t_w +wt
有符号数加法
公式
对于
−
2
w
−
1
≤
x
,
y
≤
2
w
−
1
−
1
-2^{w-1} \leq x, y \leq 2^{w-1} -1
−2w−1≤x,y≤2w−1−1:
x
+
w
t
y
=
{
x
+
y
−
2
w
,
2
w
−
1
≤
x
+
y
(
P
o
s
i
t
i
v
e
O
v
e
r
f
l
o
w
)
x
+
y
,
−
2
w
≤
x
<
2
w
−
1
(
N
o
r
m
a
l
)
x
+
y
+
2
w
,
x
+
y
<
−
2
w
(
N
e
g
a
t
i
v
e
O
v
e
r
f
l
o
w
)
(有符号数加法-公式)
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层级的表示是一样的;
因此,在计算 + w t +^t_w +wt时,可以按如下步骤进行操作:
- 将运算数转为无符号数
- 执行无符号数的加法
- 将结果转为有符号数
即 x + w t y = U 2 T w ( T 2 U w ( x ) + w u T 2 U w ( y ) ) x +^t_w y = U2T_w(T2U_w(x) +^u_w T2U_w(y)) x+wty=U2Tw(T2Uw(x)+wuT2Uw(y))
推导过程
x + w t y = U 2 T w ( T 2 U w ( x ) + w u T 2 U w ( y ) ) ∵ T 2 U w ( x ) = x w − 1 2 w + x = U 2 T w [ ( x w − 1 2 w + x + y w − 1 2 w + y ) m o d 2 w ] ∵ x + w u y = ( x + y ) m o d 2 w = U 2 T w [ ( x + y ) m o d 2 w ] ∵ x w − 1 m o d 2 w = 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种情况
预备知识:
- T M a x w ≐ ∑ i = 0 w − 2 2 i = 2 w − 1 − 1 TMax_w \doteq \sum_{i=0}^{w-2}{2^i} = 2^{w-1} -1 TMaxw≐∑i=0w−22i=2w−1−1
U 2 T w ( u ) = { u , u ≤ T M a x u − 2 w , u > T M a x ( U 2 T w ) 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 m o d 2 w , z ′ ′ ≐ U 2 T w ( 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 + w t y z'' = x +^t_w y z′′=x+wty
那么会有以下4种情况,与图片对应:
对应图中Case | z的范围 | z’的范围 | z’'的范围 |
---|---|---|---|
1 | − 2 w ≤ z < − 2 w − 1 -2^w \leq z < -2^{w-1} −2w≤z<−2w−1 |
∵
z
′
=
z
+
2
w
\because z' = z + 2^w
∵z′=z+2w ∴ 0 ≤ z ′ < − 2 w − 1 + 2 w = 2 w − 1 \therefore 0 \leq z' < -2^{w-1} + 2^w = 2^{w-1} ∴0≤z′<−2w−1+2w=2w−1 | z ′ ′ = z ′ = z + 2 w z'' = z' = z + 2^w z′′=z′=z+2w |
2 | − 2 w − 1 ≤ z < 0 -2^{w-1} \leq z < 0 −2w−1≤z<0 |
∵
z
′
=
z
+
2
w
\because z' = z + 2^w
∵z′=z+2w ∴ − 2 w − 1 + 2 w = 2 w − 1 ≤ z ′ < 2 w \therefore -2^{w-1} + 2^w = 2^{w-1} \leq z' < 2^w ∴−2w−1+2w=2w−1≤z′<2w | z ′ ′ = z ′ − 2 w = z + 2 w − 2 w = z z'' = z' - 2^w = z + 2^w - 2^w = z z′′=z′−2w=z+2w−2w=z |
3 | 0 ≤ z < 2 w − 1 0\leq z <2^{w-1} 0≤z<2w−1 | z ′ = z z' = z z′=z | z ′ ′ = z ′ = z z'' = z' = z z′′=z′=z |
4 | 2 w − 1 ≤ z < 2 w 2^{w-1} \leq z < 2^w 2w−1≤z<2w | z ′ = z z' = z z′=z | z ′ ′ = z ′ − 2 w z'' = z' - 2^w z′′=z′−2w |
溢出检测
方法
对于 T M i n w ≤ x , y ≤ T M a x w TMin_w \leq x,y \leq TMax_w TMinw≤x,y≤TMaxw,定义 s ≐ x + w t y s \doteq x +^t_w y s≐x+wty,则其溢出检测为:
- 正溢出(positive overflow):当且仅当 x > 0 并且 y > 0,但 s ≤ 0 s \leq 0 s≤0时
- 负溢出(negative overflow):当且仅当 x < 0 并且 y < 0,但 s ≥ 0 s \geq 0 s≥0 时
图例
2.3.3 Two’s-Complement Negation
公式
对于
T
M
i
n
w
≤
x
≤
T
M
a
x
w
TMin_w \leq x \leq TMax_w
TMinw≤x≤TMaxw,存在对于
+
w
t
+^t_w
+wt的加性逆,记作
−
w
t
-^t_w
−wt,有:
−
w
t
x
=
{
T
M
i
n
w
,
x
=
T
M
i
n
w
−
x
,
x
>
T
M
i
n
w
(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 = T M i n w x = TMin_w x=TMinw时:
∵ T M i n w + T M i n w = − 2 w − 1 + ( − 2 w − 1 ) = − 2 w ∴ 发送负溢出 ∴ T M i n w + w t T M i n w = − 2 w + 2 w = 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 > T M i n w x > TMin_w x>TMinw 时,-x能被表示为一个w-bit的有符号数。
bit表示
方法一
方法
求出有符号数的反码,再将其加一。
在C语言中,-x
和~x + 1
具有相同的值
示例
方法二
方法
将有符号数分成两部分:
记k为最右侧的值为1的bit位置,则 x ⃗ = [ x w − 1 , x w − 2 , . . . , x k + 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);
则有符号数的加性逆为 − w t x = [ ∼ x w − 1 , ∼ x w − 2 , . . . , ∼ x k + 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 ≤ 2 w − 1 − 1 0 \leq x,y \leq 2^{w-1} -1 0≤x,y≤2w−1−1;
它们的乘积的范围是: 0 ≤ x × y ≤ ( 2 w − 1 − 1 ) 2 = 2 2 w − 2 w + 1 + 1 0 \leq x \times y \leq (2^{w-1} -1)^2 = 2^{2w} -2^{w+1} + 1 0≤x×y≤(2w−1−1)2=22w−2w+1+1,需要2w-bit来表示。
在C语言中进行无符号数的乘法时,会将生产的2w-bit的乘积截取低w-bit来做为运算结果,将截断后的结果记作 x ∗ w u y x *^u_w y x∗wuy
截取低w-bit的方法是将乘积模上2w
公式
对于
0
≤
x
,
y
≤
U
M
a
x
0 \leq x,y \leq UMax
0≤x,y≤UMax:
x
∗
w
u
y
=
(
x
×
y
)
m
o
d
2
w
(无符号数乘法-公式)
x *^u_w y = (x \times y) \ mod \ 2^w \tag{无符号数乘法-公式}
x∗wuy=(x×y) mod 2w(无符号数乘法-公式)