原码
十进制的数据转换为二进制的表现形式就是原码,最左边表示符号位,0为正,1为负
原码计算
十进制40转为2进制为00101000,00101000就是原码,数据第一位表示符号位,后面表示具体数据,
二进制中的一个0或者1表示一个bit,8个bit为一个字节,字节是计算机中最小的存储单元,所以一个字节
最大表示的是01111111,最小表示为11111111
原码的弊端
使用原码计算时,如果是正数,完全没有问题,但是使用负数计算结果是错误的,是和我们的预期计算结果相反
原码的弊端解析
在计算正数原码从00000000(表示+0开始)开始加1是在上面+1就好,如1表示00000001,在+1为2,00000010............,正数加1使用原码计算没有问题
那我们在试下计算负数的时候原码10000000(-0),在其上+1,原码表示为10000001,其结果表示为-1,但是我们0+1应该为1才对,我们在以-1原码10000001基础上+1表示为10000010,此时结果为-2,但是我们-1+1应该为0,如果使用原码进行负数计算,计算结果是错误的
为什么出现反码
为了解决原码不可以计算负数问题
反码规则
正数的反码不变,负数的反码在原码的基础上,符号位不变,数值取反,0变1,1变0
反码负数计算
使用反码计算负数运算:如-2的原码是10000010反码为11111101,然后使用反码加1
得到反码是11111110,然后转换为原码为10000001,就是-1的原码编写形式
反码弊端
负数计算时,在不跨0使用负数反码计算是没有问题的,但是跨0使用反码计算,会跟实际的结果偏差1
反码弊端解析
十进制数字 | 原码 | 反码 |
+0 | 00000000 | 00000000 |
-0 | 10000000 | 11111111 |
-1 | 10000001 | 11111110 |
-2 | 10000010 |
11111101 |
-3 | 10000011 | 11111100 |
-4 | 10000100 | 11111011 |
使用上面表格反码依次从-4加1,当加到-0时,反码11111111 ,在反码上+1,变为00000000,在反码中表现0的方式有二种,所以在反码跨0计算的时候会出现问题,跨0计算如:-1+2反码计算11111110+00000010=0000000,在计算时就会相差1
为什么出现补码
解决反码在跨0计算出现相差1的问题
补码规则
在反码的基础上加1,将-0下面的错一位作为补码
十进制数字 | 原码 | 反码 | 补码 |
+0 | 00000000 | 00000000 | 00000000 |
-0 | 10000000 | 11111111 | 00000000 |
-1 | 10000001 | 11111110 | 11111111 |
-2 | 10000010 | 11111101 | 11111110 |
-3 | 10000011 | 11111100 | 11111101 |
-4 | 10000100 | 11111011 | 11111100 |
… | … | … | … |
-126 | 11111110 | 10000001 | 10000010 |
-127 | 11111111 | 10000000 | 10000001 |
-128 | 无 | 无 | 10000000 |
补码跨0计算
-1+2补码相加11111111+00000010=00000001,就解决跨0问题,然后补码就空出以为10000000,然后把空出的这一位变为的-128
补码注意点
计算机中的存储和计算都是以补码的形式进行的