首先,你要记住并且不要问为什么:“在计算机中,所有的数据,最终都是使用二进制数表达的。

还要记住并且不要问为什么:“在计算机中,正数是直接用原码来表示和存储的。

要记住并且不要问为什么:“在计算机中,负数是以它的补码(即它的反码+1)来表示和存储的。


对于允许是负数的数值(称为带符号的数值),必须先确定一个固定的长度(换言之,就是二进制数的位数),再把最左边的最高位设置为符号位。必须固定位数,这样才能避免符号位与其他位的混淆。

只要知道每个数值的位数,就可以找到符号位,它应是最左边的那一位。如果符号位是0,该数值就是正的;如果它是1,该数值就是负的。


⑴原码表示法规定:套用十进制的思路,用最左边的最高位来表示该数的符号位(0表示正数,1表示负数),剩余的其他位数用来表示该数的绝对值。关键:理解符号位其他位数

原码:一个整数,按照其绝对值大小转换成二进制数,并在最左边的最高位用0或1来表示其正负,称为原码。

例①:正数 5 的原码是:0000 0101。

    而负数 -5 的原码是:1000 0101。


反码:将原码,除符号位外的其他位数每一位按位取反,所得到的新的二进制数,称为反码。(口诀:符号位不变其他位取反

⑵反码表示法规定:零、正数的反码与原码相同,负数的反码为对该数的原码除符号位外每一位取反。

例②:正数 5 的反码与原码相同:0000 0101。

    而负数 -5 的原码是:1000 0101,对该数的原码除符号位外每一位取反,得到反码:1111 1010。


补码:反码加1,称为补码。(口诀:符号位不变其他位先取反再加1

⑶补码表示法规定:零、正数的补码与原码相同,负数的补码为对该数的原码除符号位外每一位取反,然后在最后一位加1。

例③:正数 5 的补码与原码相同:0000 0101。

    而负数 -5 的原码是:1000 0101,对该数的原码除符号位外每一位取反,然后在最后一位加1,得到补码:1111 1011。


所以,在计算机中,负数 -5 是以它的补码(即它的反码+1):1111 1011 来表示和存储的。


不管是正数还是负数,其反码或补码的最高位,都是和原码的最高位一样!(请看原码表示法的规定,还有反码表示法和补码表示法的规定!)

  因为,正数的反码或补码,都是与原码相同,所以最高位是不变的。

  因为,负数的反码或补码,都是在原码的基础上,保持最高位不变,其他位数每一位取反,甚至在最后一位加1。



以上都是教我们,把我们熟悉的十进制的正数或负数,转化成计算机熟悉的二进制的数:

十进制:原码->符号位不变,先取反->反码->再加1->补码

那反过来,看到计算机熟悉的二进制的正数或负数,如何转换成我们熟悉的十进制的数?

补码->先减1->反码->符号位不变,再取反->原码:十进制


首先,要知道该二进制数的最高位:如果最左边的最高位(即符号位)为0则是正数,为1则是负数。

  二进制的正数,要转换成十进制,请先将其写成“加权系数展开式”,然后用“按位权相加”法,即可转换成十进制。

  二进制的负数,要转换成十进制,首先要理解上面的“在计算机中,负数是以它的补码(即它的反码+1)来表示和存储的”这句话的精髓,然后反过来逆推(符号位不变其他位先减1再取反):


例⑤:十进制的 -10 在原码表示法里,其原码是:1000 1010;对该数的原码除符号位外每一位取反,得到反码:1111 0101,然后在最后一位加1,得补码:1111 0110。

反过来逆推,二进制的 1111 0110(可理解为已知补码),先减1,得出(反码):1111 0101;除符号位外每一位取反,得出(原码):1000 1010;它在原码表示法里,最高位1表示负数,剩余的其他位数表示该数的绝对值,得:-10。


再看看逆推过程:

1111 0110

先     -1

---------

1111 0101

再取反:

---------

1000 1010 = 在原码表示法里,最高位1表示负数,剩余的其他位数表示该数的绝对值,得:-10。

(这是按照补码的原理来逆推原码。相当于只有0点和6点的钟,原来在0点,逆时针拨可到6点)


试试对该二进制数求补码:

1111 0110

先取反:

---------

1000 1001

再     +1

---------

1000 1010 = 用原码表示法来理解,也是十进制中的 -10。

原码取反加1得补码补码取反加1也得出原码。这是抖机灵。相当于只有0点和6点的钟,原来在0点,顺时针拨也可到6点)


如果已知补码求原码,可将补码过程逆推(即符号位不变,其他位先减1再取反)即得到原码,亦可将该补码再求补码(即符号位不变,其他位先取反再加1)也能得到原码

  其实,看到某个二进制数,你可以理解为已经知道补码,只需用上面定律⑸求出原码,最后将原码转换成十进制,不就行了?


一个二进制数,如果每位取反(最高位符号位也取反,所以不是反码),取反得到的值和原来的值,相加等于-1(不是0,也不是1)

  所以,求某个二进制数取反的值,可用:-1-(该二进制数的值),即该二进制数的值的相反数减1。