一直以来,补码是按位取反加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
得证。