一直以来,补码是按位取反加1都是既定的规则,但是大学的基础教程里面对为什么是这个值却没有给出答案。最近看csapp中发现其中补码的定义
对向量
x
→
=
[
x
w
−
1
,
x
w
−
2
,
.
.
.
,
x
0
]
\stackrel{\rightarrow}{x}=[x_{w-1},x_{w-2},...,x_0]
x→=[xw−1,xw−2,...,x0],其补码定义为:
B 2 T w ( x → ) = − x w − 1 2 w − 1 + ∑ i = 0 w − 2 x i 2 i B2T_w(\stackrel{\rightarrow}{x})=-x_{w-1}2^{w-1}+\sum^{w-2}_{i=0}x_i2^i B2Tw(x→)=−xw−12w−1+i=0∑w−2xi2i
其中B代表二进制,T代表补码,w代表一共多少位。
举例说明:
B
2
T
4
(
[
0001
]
)
=
−
0
∗
2
3
+
0
∗
2
2
+
0
∗
2
1
+
1
∗
2
0
=
1
B_2T_4([0001])=-0*2^3+0*2^2+0*2^1+1*2^0=1
B2T4([0001])=−0∗23+0∗22+0∗21+1∗20=1
B
2
T
4
(
[
1011
]
)
=
−
1
∗
2
3
+
0
∗
2
2
+
1
∗
2
1
+
1
∗
2
0
=
−
5
B_2T_4([1011])=-1*2^3+0*2^2+1*2^1+1*2^0=-5
B2T4([1011])=−1∗23+0∗22+1∗21+1∗20=−5
B
2
T
4
(
[
0101
]
)
=
−
0
∗
2
3
+
1
∗
2
2
+
0
∗
2
1
+
1
∗
2
0
=
5
B_2T_4([0101])=-0*2^3+1*2^2+0*2^1+1*2^0=5
B2T4([0101])=−0∗23+1∗22+0∗21+1∗20=5
最后一个是倒数第二个的按位取反加一,倒数第二个也是最后一个的按位取反加1。5和-5互为相反数。
要证明补码等于原二进制的按位取反加1,就是证明原数的相反数=原数的按位取反加1,原数的相反数:
0
−
B
2
T
w
(
x
→
)
=
0
−
(
−
x
w
−
1
2
w
−
1
+
∑
i
=
0
w
−
2
x
i
2
i
)
=
x
w
−
1
2
w
−
1
−
∑
i
=
0
w
−
2
x
i
2
i
0-B2T_w(\stackrel{\rightarrow}{x})=0-(-x_{w-1}2^{w-1}+\sum^{w-2}_{i=0}x_i2^i)=x_{w-1}2^{w-1}-\sum^{w-2}_{i=0}x_i2^i
0−B2Tw(x→)=0−(−xw−12w−1+i=0∑w−2xi2i)=xw−12w−1−i=0∑w−2xi2i
因为:1-0=1,1-1=0
所以:x取反=1-x
原 数 的 按 位 取 反 加 1 = − ( 1 − x w − 1 ) 2 w − 1 + ∑ i = 0 w − 2 ( 1 − x i ) 2 i + 1 原数的按位取反加1=-(1-x_{w-1})2^{w-1}+\sum^{w-2}_{i=0}(1-x_i)2^i+1 原数的按位取反加1=−(1−xw−1)2w−1+i=0∑w−2(1−xi)2i+1
于是问题归结为,求证:
x
w
−
1
2
w
−
1
−
∑
i
=
0
w
−
2
x
i
2
i
=
−
(
1
−
x
w
−
1
)
2
w
−
1
+
∑
i
=
0
w
−
2
(
1
−
x
i
)
2
i
+
1
x_{w-1}2^{w-1}-\sum^{w-2}_{i=0}x_i2^i=-(1-x_{w-1})2^{w-1}+\sum^{w-2}_{i=0}(1-x_i)2^i+1
xw−12w−1−i=0∑w−2xi2i=−(1−xw−1)2w−1+i=0∑w−2(1−xi)2i+1
开始证明:
等号右边:
−
(
1
−
x
w
−
1
)
2
w
−
1
+
∑
i
=
0
w
−
2
(
1
−
x
i
)
2
i
+
1
=
−
2
w
−
1
+
x
w
−
1
2
w
−
1
+
∑
i
=
0
w
−
2
2
i
−
∑
i
=
0
w
−
2
x
i
2
i
+
1
-(1-x_{w-1})2^{w-1}+\sum^{w-2}_{i=0}(1-x_i)2^i+1=-2^{w-1}+x_{w-1}2^{w-1}+\sum^{w-2}_{i=0}2^i-\sum^{w-2}_{i=0}x_i2^i+1
−(1−xw−1)2w−1+i=0∑w−2(1−xi)2i+1=−2w−1+xw−12w−1+i=0∑w−22i−i=0∑w−2xi2i+1
跟等号左边约分:
求证:
0 = − 2 w − 1 + ∑ i = 0 w − 2 2 i + 1 0=-2^{w-1}+\sum^{w-2}_{i=0}2^i+1 0=−2w−1+i=0∑w−22i+1
归结为:
2
w
−
1
=
∑
i
=
0
w
−
2
2
i
+
1
2^{w-1}=\sum^{w-2}_{i=0}2^i+1
2w−1=i=0∑w−22i+1
得证。