原码、反码、补码学习总结
原码反码补码的定义
原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负
反码:正数的补码反码是其本身,负数的反码是符号位保持不变,其余位取反
补码:正数的补码是其本身,负数的补码是在其反码的基础上1
原码
比如12的二进制就是00001100,其中每个0或1叫做一个比特位(bit),8个bit为一组称作字节。
不难看出,原码的最大值是01111111,及十进制的127,最小值是11111111,及-127。
利用原码对正数进行计算是不会有问题的 。
但是在对负数进行运算时会有一些弊端。
原码的弊端
在对10000000进行加一运算时,-0+1结果应该是1,但是原码的结果是10000001也就是-1,再加一,-1+1的结果应该是0,但是原码却是10000010也就是-2。
所以,如果是负数计算,结果就会出错,实际运算的结果,跟我们预期的结果是相反的。
反码
为了解决原码不能计算呢负数的问题而出现了反码。
计算规则:正数的反码不变,负数的反码在原码的基础上,符号位不变,数值取反,0变1,1变0。
例:-12的原码是10001100反码是11110011,-12+1=-11,11110011+1=11110100,再转化为原码就是10001011也就是-11
反码的不足
-0的原码是10000000,对其反码(11111111)加一得到00000000按照规则,00000000的原码还是00000000也就是十进制数字的0,-0+1=0是显然不对的
反码计算时,跨零会出现误差1,所以有了补码
补码
为了除掉误差,规定正数的补码不变,负数的补码在反码的基础上加一
误差消除了,但是因为补码是在反码的基础上加一所以-127的补码变成了10000001,空出来了一个10000000,于是规定10000000表示十进制的-128,-128没有原码和反码
所以一个字节的存储范围是-128到127
另外计算机中的存储和计算都是以补码的形式进行的