原码、反码、补码的理解,为什么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),需要保留符号位计算。

于是使用补码,可以解决所有的计算问题。

有些理解可能不是很深入,希望大家批评指正!

posted @ 2020-08-31 21:47  king断雨  阅读(160)  评论(0)    收藏  举报