这篇文章会涉及到三个名词:
原码
反码
补码
如果你和我一样,有些忘记这三个名词分别是什么意思了,也不必急着新建一个浏览器窗口去查它们的意思。因为,这篇文章就是围绕着这三个名词来的。
首先,负数在计算机中以补码的形式存储。我觉得这有必要说在前面。
1个字节只能表示258个数,一个字节可以表示的有符号数的范围就是-128-127。
作为有符号数,我们用一个字节的最高位作为符号位。并且我们规定,正数的符号位为0,负数的符号位为1。
剩下的7位可以表示2^7个数,算上正负两种情况,正好是258个数。
0在计算机中存储为0000 0000,这似乎不难理解。
正如你所想,我们可以按照无符号数的表示方法来表示有符号数正数。那么,1-127我们可以依次表示为0000 0001 - 0111 1111. 没错,这很合理。
如果你在想是否可以用1000 0001 - 1111 1111依次表示-1到-127. 但是,如果这样的话,我们稍加观察就会发现,1000 0000似乎被我们遗忘了,导致现在一个字节只表示了255个数。
实际上,1000 0000表示最小的负数,就是这里的-128. 而且,1000 0001 - 1111 1111并不是-1到-127的二进制表示,正好相反,1000 0001 - 1111 1111它是-127到-1的二进制表示。
现在该回到前面说的了,“负数在计算机中以补码的形式存储”。那么,什么是补码?
这里,先说下原码。首先,绝对值相同的数的原码相同(不包括符号位)。那么我们说正数的原码应该就很好理解了,就是正数的二进制表示。
再引出另一个概念,反码。反码就是原码按位取反的结果。
注意,正数的原码、反码和补码一样,均是原码的形式。
如果,原码和反码的概念我们已经回忆起来了,那该说下补码了。
补码是反码加1之后的结果。
举个例子
十进制 原码 反码 补码 二进制
86 0101 0110 0101 0110 0101 0110 0101 0110
-86 1101 0110 1010 1001 1010 1010 1010 1010
似乎一切都说的通了。