数据存储方式
二进制的数据有原码,反码,补码三种表现方式,而内存中的数据是以补码的形式存储的 原码: 我们见到的的二进制数据 如:1的原码 0000 0001 -1原码:1000 0001 反码: 正数按原码按位取反,负数符号位不变其余位按位取反 如:1的反码 1111 1110 -1的反码 1111 1110 补码:正数的补码是其本身 负数的补码是 符号位不变其余位按位取反后+1 如 1的补码 0000 0001 -1的补码 1111 1111 。
为什么以补码存储
因为大部分的数字电路的CPU实现了加法器没有实现减法器,实现减法器是非常复杂的,所以CPU为了更方便的计算减法,将减法转换成加法来计算如:5-1 == 5+(-1)而要实现加一个负数用源码和反码是计算不准确的,只有补码才能计算正确,所以计算机都采用补码作为数据存储以及计算的格式。
例子
5+(-1) 结果=4 二进制码为 0000 0100 溢出位舍弃 ** 补码求源码和源码求补码步骤都是一样的,已知一个数的补码,求原码的操作其实就是对该补码再求补码。
用原码计算
0000 0101 //5
1000 0001 //-1
1000 0110 //结果 != 0000 0100
用反码计算
1111 1010 //5
1111 1110 //-1
1111 1000 //结果 != 0000 0100
用补码计算
0000 0101 //5
1111 1111 //-1
0000 0100 //正数的补码还是本身 结果 == 0000 0100
// 1 + (-2)
0000 0001 //1的补码
1111 1110 //-2的补码
1111 1111 // 再求补码 1000 0001 == -1
从结果看只有补码的减法计算结果是正确的。 我们来思考一个小问题,打印python语言的 ~5(5取反)值为多少呢? 答案是-6。
0000 0101 //因为5的二进制码是
1111 1010 //将5取反
1000 0110 //转换为补码 就是-6
二进制转十进制有一种很方便的口算方式,就是8421计算法
0000 0101 //5
8421 //4 + 1 = 5