在计算机中,数字的计算都是基于补码形式进行计算的;正数的原码,反码,补码一致;
-
原码:十进制数据的二进制表现形式,最左边是符号位,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;而反码==原码符号位不动,其他位取反,这样计算机就可以保证正负数都能计算正确!