1.分析
类似于十进制加法,对于两个w位的二进制位模式相加,可以得到另一个位模式(可能为w位,也可为w+1位)
两个数的w位补码之和与无符号之和有相同的位级表示(二进制的加法运算是相同的,补码加法和无符号加法对溢出的处理也是相同的——截断,只是对二进制结果的解释不同)
例如:1011 1101 (补码:-5 -3 无符号:11 13)
1011
+ 1101
--------
11000
截断为4位:1000(补码:-8 无符号:8)
所以我们可以在无符号加法的基础上得到补码加法,即对于两个有符号数的加法,可以先使用 T 2 U w T2U_w T2Uw转换位无符号数,使用 + w u +_w^u +wu,得到无符号数的结果,再使用 U 2 T w U2T_w U2Tw转换成有符号数,这样就得到了补码加法的结果
2.公式推导
对于两个w位的有符号数x、y,
−
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
−
2
-2^w\leq x+y \leq 2^w - 2
−2w≤x+y≤2w−2,有
2
w
+
1
−
1
2^{w+1} - 1
2w+1−1个数,故需要
w
+
1
w + 1
w+1位进行表示,对于补码加法一般是直接将x+y的结果截断位w位表示,则有
x
+
w
t
y
=
U
2
T
w
[
(
T
2
U
w
(
x
)
+
T
2
U
w
(
y
)
)
m
o
d
2
w
]
(补码截断为
w
位的公式)
=
U
2
T
w
[
(
x
w
−
1
2
w
+
x
+
y
w
−
1
2
w
+
y
)
m
o
d
2
w
]
(补码转无符号公式)
=
U
2
T
w
[
(
x
+
y
)
m
o
d
2
w
]
\begin {align} &\,\,\,\,\,\,\,\,x+_w^t y = U2T_w\left[\left(T2U_w(x) +T2U_w(y)\right) mod2^w\right](补码截断为w位的公式)\\[1ex] &=U2T_w\left[\left(x_{w-1}2^w+x + y_{w-1}2^w + y\right)mod2^w\right](补码转无符号公式)\\[1ex] &=U2T_w\left[\left(x+y\right)mod2^w\right]\\[2ex] & \end {align}
x+wty=U2Tw[(T2Uw(x)+T2Uw(y))mod2w](补码截断为w位的公式)=U2Tw[(xw−12w+x+yw−12w+y)mod2w](补码转无符号公式)=U2Tw[(x+y)mod2w]
- 对于无符号数加法来说,如果 x + y x+y x+y没有溢出,则 x + w u y = x + y x+_w^uy = x + y x+wuy=x+y,不需要进行处理,因为无符号没有溢出,相当于第 w + 1 w+1 w+1位为0,截断第 w + 1 w+1 w+1位对于没有溢出的无符号加法的结果并没有影响;但是对于补码加法来说, x + y x+y x+y没有溢出, x + w t ≠ x + y x+_w^t \neq x+y x+wt=x+y,因为 x + y x+y x+y没有溢出,不等于第 w + 1 w+1 w+1位为0,所以截断第 w + 1 w+1 w+1位,无论有没有溢出都有影响,因此需要分情况进行讨论:
-
−
2
w
≤
x
+
y
<
−
2
w
−
1
-2^w\leq x+y < -2^{w - 1}
−2w≤x+y<−2w−1:
- ( x + y ) m o d 2 w = x + y + 2 w (x+y)mod2^w = x+y+2^w (x+y)mod2w=x+y+2w(对于负数,w+1位为1,截断为 w w w位表示,即 + 2 w +2^w +2w),所以 0 ≤ ( x + y ) m o d 2 w < 2 w − 1 0\leq(x+y)mod2^w<2^{w-1} 0≤(x+y)mod2w<2w−1,
- ( x + y ) m o d 2 w (x+y)mod2^w (x+y)mod2w的结果为无符号数,所以需要使用 U 2 T w U2T_w U2Tw转换为有符号数,
- 又因为 ( x + y ) m o d 2 w ≤ T M a x w = 2 w − 1 − 1 (x+y)mod2^w\leq TMax_w=2^{w-1}-1 (x+y)mod2w≤TMaxw=2w−1−1,所以 U 2 T w [ ( x + y ) m o d 2 w ] = x + y + 2 w U2T_w[(x+y)mod2^w] = x+y+2^w U2Tw[(x+y)mod2w]=x+y+2w,即 x + w t y = x + y + 2 w x+_w^ty = x+y+2^w x+wty=x+y+2w
-
−
2
w
−
1
≤
x
+
y
<
0
-2^{w - 1}\leq x+y<0
−2w−1≤x+y<0:
- ( x + y ) m o d 2 w = x + y + 2 w (x+y)mod2^w = x+y+2^w (x+y)mod2w=x+y+2w(对于负数,w+1位为1,截断为 w w w位表示,即 + 2 w +2^w +2w),所以 2 w − 1 ≤ ( x + y ) m o d 2 w < 2 w 2^{w-1}\leq(x+y)mod2^w<2^{w} 2w−1≤(x+y)mod2w<2w,
- ( x + y ) m o d 2 w (x+y)mod2^w (x+y)mod2w的结果为无符号数,所以需要使用 U 2 T w U2T_w U2Tw转换为有符号数,
- 又因为 ( x + y ) m o d 2 w > T M a x w = 2 w − 1 − 1 (x+y)mod2^w> TMax_w=2^{w-1}-1 (x+y)mod2w>TMaxw=2w−1−1,所以 U 2 T w [ ( x + y ) m o d 2 w ] = x + y + 2 w − 2 w U2T_w[(x+y)mod2^w] = x+y+2^w-2^w U2Tw[(x+y)mod2w]=x+y+2w−2w,即 x + w t y = x + y x+_w^ty = x+y x+wty=x+y
-
0
≤
x
+
y
<
2
w
−
1
0\leq x+y < 2^{w-1}
0≤x+y<2w−1:
- ( x + y ) m o d 2 w = x + y (x+y)mod2^w = x+y (x+y)mod2w=x+y(对于正数,w+1位为0,截断为 w w w位表示,没有影响),所以 0 ≤ ( x + y ) m o d 2 w < 2 w − 1 0\leq(x+y)mod2^w<2^{w-1} 0≤(x+y)mod2w<2w−1,
- ( x + y ) m o d 2 w (x+y)mod2^w (x+y)mod2w的结果为无符号数,所以需要使用 U 2 T w U2T_w U2Tw转换为有符号数,
- 又因为 ( x + y ) m o d 2 w ≤ T M a x w = 2 w − 1 − 1 (x+y)mod2^w\leq TMax_w=2^{w-1}-1 (x+y)mod2w≤TMaxw=2w−1−1,所以 U 2 T w [ ( x + y ) m o d 2 w ] = x + y U2T_w[(x+y)mod2^w] = x+y U2Tw[(x+y)mod2w]=x+y,即 x + w t y = x + y x+_w^ty = x+y x+wty=x+y
-
2
w
−
1
≤
x
+
y
<
2
w
2^{w-1}\leq x+y<2^w
2w−1≤x+y<2w:
- ( x + y ) m o d 2 w = x + y (x+y)mod2^w = x+y (x+y)mod2w=x+y(对于正数,w+1位为0,截断为 w w w位表示,没有影响),所以 2 w − 1 ≤ ( x + y ) m o d 2 w < 2 w 2^{w-1}\leq (x+y)mod2^w<2^w 2w−1≤(x+y)mod2w<2w,
- ( x + y ) m o d 2 w (x+y)mod2^w (x+y)mod2w的结果为无符号数,所以需要使用 U 2 T w U2T_w U2Tw转换为有符号数,
- 又因为 ( x + y ) m o d 2 w > T M a x w = 2 w − 1 − 1 (x+y)mod2^w> TMax_w=2^{w-1}-1 (x+y)mod2w>TMaxw=2w−1−1,所以 U 2 T w [ ( x + y ) m o d 2 w ] = x + y − 2 w U2T_w[(x+y)mod2^w] = x+y-2^w U2Tw[(x+y)mod2w]=x+y−2w,即 x + w t y = x + y − 2 w x+_w^ty = x+y-2^w x+wty=x+y−2w