这篇文章会涉及到三个名词:

 

原码

反码

补码

 

如果你和我一样,有些忘记这三个名词分别是什么意思了,也不必急着新建一个浏览器窗口去查它们的意思。因为,这篇文章就是围绕着这三个名词来的。

 

首先,负数在计算机中以补码的形式存储。我觉得这有必要说在前面。

 

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

 

似乎一切都说的通了。