本帖最后由 那一剑的风情 于 2013-10-28 08:55 编辑
刚开始自学毕老师的java基础视频,看到关于负数的原码、反码、补码时有点迷糊。上网查了下资料,自己总结推导了一下负数的补码公式。如有不对的地方请大家指出,谢谢。
已知:1.计算机中的数据均以二进制的补码形式进行存储、运算。最高位为符号位,0为正,1为负
2.正数的原码、反码、补码均相同;
负数的原码为最高位为1,其余位与其绝对值的原码相同;
负数的反码为最高位为1不变,其余位的原码取反;
负数的补码为 负数的反码加1(要证明这个)
定义两个n位二进制正整数 x, y
证明: (-x)补= ( -x )反+1
证明如下: 引入补数的概念:对于n位二进制正整数,
.若a+b=2^n,则a,b 互为补数;
对于减法运算 y-x=y+(-x)
=y-(2^n-x(补)) ;x(补)表示补数,并非补码
=y+x(补)-2^n
可以发现2^n最高位为1且溢位,其他位均为0.对最后的结果不会产生影响
得到:y+(-x)=y+x(补)
这时可以看出x(补)的原码即是-x在参与运算时显示的补码。由此可见补码是果而不是因,是人为定义的
(-x)补=x(补)=2^n-x=2^n-1-x+1
2^n-1-x即是对x进行取反操作 即 2^n-1-x=(-x ) 反
所以得到 : (-x)补=(-x ) 反+1
|