原码、反码、补码的理解,为什么Java要用补码存数据
为了解决计算上的问题,补码可以保证计算不出错
- 正数的三码相等
- 负数:反码=原码除符号位外相反,补码=反码+1
原码:
- 正数相加:3(0011)+ 2(0010)= 5(0101),没问题
- 正负相加:3(0011)- 2(1010)= -5(1101),出错了
- 负负相加:-3(1011)- 2(1010)= -5(1101),貌似也没问题,但是符号位要保留
反码:看能否解决正负相加问题
- 正负相加:3(0011)- 2(1101)= -7(1000),出错了
补码:看能否解决正负相加的问题
- 正负相加:3(0011)- 2(1110)= 1(10001),对于四位二进制数,最大只能存放4位(硬件决定了),如果我们低四位,正好是0001(1),正好是我们想要的结果。需要符号位也参与相加。
负数的补码可以看作负数的余数,-2的余数是6,那么-2和+6是一样的,-2的补码就是【符号位(1) + 6的原码(0110)】:1110 - 正数相加:与原码一样。3(0011)+ 2(0010)= 5(0101)
- 负数相加:-3(1101)- 2(1110)= -5(1011),需要保留符号位计算。
于是使用补码,可以解决所有的计算问题。
有些理解可能不是很深入,希望大家批评指正!

浙公网安备 33010602011771号