计算机底层原码,反码,补码实现的一些理解总结

在计算机中,数字的计算都是基于补码形式进行计算的;正数的原码,反码,补码一致

  • 原码:十进制数据的二进制表现形式,最左边是符号位,0为正;1为负;

    原码存在的问题:遇到负数时,会出现计算相反的问题

    //一个字节有8个bit(位)
    10000001---->-1
    01111111---->127
    //当负数相加时,计算错误,-2+1=-3
    10000010+00000001=100000011
  • 反码:正数反码不变;负数的反码在原码的基础上,符号位不变,数值取反

    反码存在问题:进行跨0运算时,与实际结果相差1

    //-2的原码
    100000010
    //-2的反码
    111111101
    //当跨0计算时,-2+3=+0(错误)
    111111101+00000011=(1)00000000=0
  • 补码:解决负数计算时跨0的问题。正数补码不变,负数补码是在反码的基础上+1,所以补码可以多记录一个 -128值,-128在1字节下,没有原码和反码。

    //-2的反码
    111111101
    //-2的补码
    111111110
    //当跨0计算时,-2+3=1(正确)
    111111110+00000011=(1)00000001=1
    //-128为
    100000000
  • java中类型强转:

    int a=200;//0000 0000 0000 0000 0000 0000 1100 1000
    //保留一个字节长度,就转变成了1100 1000的补码形式
    byte b=(byte)a; //1100 1000=-56

    总结一下:计算机中数字的计算时基于补码计算的,正数的原码,反码,补码都相同;当遇到负数时,负数的补码==反码+1;而反码==原码符号位不动,其他位取反,这样计算机就可以保证正负数都能计算正确!

猜你喜欢

转载自blog.csdn.net/zhangkai__/article/details/127559462