二进制数据在内存中的存储

2,210 阅读2分钟

数据存储方式

二进制的数据有原码,反码,补码三种表现方式,而内存中的数据是以补码的形式存储的 原码: 我们见到的的二进制数据 如: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