为什么补码是按位取反再加1

一直以来,补码是按位取反加1都是既定的规则,但是大学的基础教程里面对为什么是这个值却没有给出答案。最近看csapp中发现其中补码的定义
对向量 x → = [ x w − 1 , x w − 2 , . . . , x 0 ] \stackrel{\rightarrow}{x}=[x_{w-1},x_{w-2},...,x_0] x=[xw1,xw2,...,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)=xw12w1+i=0w2xi2i

其中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])=023+022+021+120=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])=123+022+121+120=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])=023+122+021+120=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 0B2Tw(x)=0xw12w1+i=0w2xi2i=xw12w1i=0w2xi2i

因为: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=(1xw1)2w1+i=0w2(1xi)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 xw12w1i=0w2xi2i=(1xw1)2w1+i=0w2(1xi)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 (1xw1)2w1+i=0w2(1xi)2i+1=2w1+xw12w1+i=0w22ii=0w2xi2i+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=2w1+i=0w22i+1

归结为:
2 w − 1 = ∑ i = 0 w − 2 2 i + 1 2^{w-1}=\sum^{w-2}_{i=0}2^i+1 2w1=i=0w22i+1

得证。

你可能感兴趣的:(计算机基础)