每个人的Python:数学、算法和游戏编程训练营
上QQ阅读APP看书,第一时间看更新

2.1.2 计算机中数据的存储方式

无论多么复杂的数据类型,其都是通过某种编码方式将其进行编码,以二进制的方式进行存储。例如,中文中有非常多的汉字,若要在计算机中存储中文,则每个汉字都要对应一段特殊的二进制数值。对于数值类型,虽然其可以方便地转换为二进制,但是在内存中,实际存储的是二进制数值的补码。

单纯就二进制数值来说,其并没有办法表示负数,也没有办法表述小数。但在实际应用中,负数和小数是非常常见的。

先说负数,在计算机中,如果需要使用到负数,通常专门使用一个位来表示符号,0表示“正”,1表示“负”。由于数学中的0不分正负,如果直接使用数值的二进制方式存储到内存,就会产生“正0”和“负0”的问题。使用补码的方式存储数据,就保证了数学中的数值与内存中存储的二进制数值一一对应,并且可以让计算机中的加减运算统一处理。

求一个数的补码分两种情况,对正数求补码和对负数求补码。

对正数求补码,则其原码本身就是补码,假设我们使用8个二进制位来存储数据,最高位为符号位,余下7位正常描述数值,十进制正数3的二进制原码表示方式为:

       0000 0011

正数的补码与原码一致。对于负数来说,求补码需要分两步进行,首先计算负数的绝对值的源码,例如十进制负数3的绝对值对应的二进制原码为:

       0000 0011

之后对绝对值的原码求反码,即将所有二进制位取反,结果如下:

        1111 1100

在反码的基础上加1即求得补码,结果如下:

        1111 1101

最终,负数3存储在内存中的二进制数据就是11111101。

在将内存中存储的数据读取出来使用时,需要将补码转换为原码,补码转换为原码的方法也非常简单,只需要对补码再一次求补码即可。