xnxn-1......x0 , xn为符号位
[x]补 = x x>=0
[x]补= 2n+1+x x<=0
由于正数的原码,反码,补码都一样,所以没啥可讨论的,主要就是负数。负数的补码等于原码除了符号位的'1'之外其他位按位取反后加1,还有一种求法就是从原码的最右一位开始逐渐向左找到第一个为1得位k,把第k为之前的位取反就是补码。
对于 [ [x]补 ]补 = [x]原 的证明,
假设一个数 a(a<0) 可以表示为 an=1(符号位) an-1an-2......a0 , a的反码表示为 : bn=1(符号位) bn-1bn-2......b0 (bi=~ai ,0<=i<n) , a的补码表示为 cn=1cn-1......c0 ,
令 A=SUM{ 2i*ai 0<=i<n} , B=SUM{ 2i*bi 0<=i<n} , C=SUM{ 2i*ci 0<=i<n}
不难看出C=B+1=2n-1-A+1=2n-A , 即 A+C=2n ,设D是c的补码对应的除符号位的数值,那么我们有 C+D=2n, --> A==D ,所以原码的补码的补码还是原码。
对于特殊数据,假设有8位,那么1000 0000,不满足上述推导式子 A+C==2n ,但是他的补码就是他自己,所以也满足 [ [x]补 ]补 = [x]原。
通过这个图也可以看出来 原码值+补码值的和是一定的(对于负数来说),所有的数都满足这个规律。
反应在数轴上的话就是
-128 |
-127 |
-126 |
... |
.. |
.. |
.. |
.. |
.. |
-64 |
.. |
.. |
... |
.. |
.. |
.. |
-2 |
-1 |
-0 |
如果把原点平移到-64的位置的话,那么相同颜色对应的数就相当于互为相反数,所以一个数的相反数的相反数肯定就是这个数了!