一、正数

正数的源码、反码、补码都是相同的。

二、负数

 1、负数的源码与反码的相互转换

    负数的源码转换为反码:符号位不变,数值位按位取反。

    例如: 

源码:1000 1100
反码:1111 0011

 

    负数的反码转换为源码:符号位不变,数值位按位取反。

    例如:

反码:1011 0101
源码:1100 1010

 2、负数的源码和补码的相互转换

    负数的源码转换为补码:1、先转换为反码(符号位不变,数值位按位取反)2、在反码的基础上末位加一。

       例如:

源码:1010 0101
反码:1101 1010
补码:1101 1011

   负数的补码转换为源码:符号位不变,数值位按位取反,末位加一。

   例如:

补码:1110 1011
补码取反:1001 0100
源码:1001 0101

3、负数的反码和补码的相互转换

   负数的反码转换为补码:末位加一

     例如:

反码:1100 1110
补码:1100 1111

     负数的补码转换为反码(源码的反码):末位减一

     例如:

补码:1100 1110
反码:1100 1101 (借位减)

4、正数取反

  先将正数源码按位取反,得到一个负数,由于负数以补码形式存在,再转换为负数的反码,最后末位加一得到补码。

  例如:

0000 1100 #源码
1111 0011 #正数取反得到负数的源码
1000 1100 #负数的源码取反后得到反码
1000 1101 #反码加一得到补码

5、计算机存储数据以补码的形式(原文链接:)

        数据是以一串二进制的数字储存在计算机中,而数据转化为二进制的数值就是称为原码。比如说整数10的原码为0000 1010(八位二进制),其中最左边的一位作为符号位,值为0即为正数,值为1为负数。

        但是如果直接以原码的形式存在计算机中,那么为引来一个bug: -0和+0的原码形式不统一,-0的原码为1000 0000,而+0的原码为+0000 0000。但是在数学上-0和+0的意义应该是一样的,均为0。

        这还不是计算机不以原码储存的一个原因,另外一个原因就在于计算机它只能做加法运算,所以计算机的减法运算还要转化成加法运算来实现。那通过什么办法实现呢。

        平时日常生活所用到的时钟,我们可以把时钟的时间值看做是十二进制的一种计数器(比如1点钟和13点钟的时针指的是同一个值),所以说 5 - 3  = 2 。 这个式子可以看作是五点钟逆时针转了3个钟到了2点钟。 我们可以把式子变一下, 5 - 2 = 5 + ( 12 - 2 ) = 15 = 3 (这里15 = 3 是因为 15点的时钟指的是3点钟,也可以看成15超过了12,所以舍去了12变成了3)。

        所以在这里我们引出一个概念,这里的容量12被称为模,我个人认为模应该是指在一种数学环境中数可选的容量,就像二进制中的模为2。而上面的推断也启示了我们可以将减数变成模减去减数的绝对值,然后和被减数相加得到原本减法的结果。所以我们可以在原码中,把正数的原码不变,负数的原码通过模减去这个原码得到的一串新的二进制数字串,称作补码(根据规定,我们将正数的补码等于原码)。比如说-3的原码为1000 0011,而八位二进制数的模为1 0000 0000,所以其补码为1 0000 0000 - 1000 0011 = 1111 1101,即1111 1101是-3的补码。

        我们可以吧这个运算过程转化一下 1 0000 0000 - 1000 0011 = 1111 1111 - 1000 0011 + 0000 0001,把式子转化成这样子后,由于1111 1111 - 1000 0011的运算就跟把1000 0011的所有位数的值取反一样,而取反得到的原码则被称为反码(在规定中,正数的反码等于原码,而负数取反过程中其符号位不变,所以可能会与之前讲的求补码的过程有冲突,而作者在之前的例子会出现改变符号位的可能,所以按照规定还是保持符号位不变,其他位取反),所以上式子中,1000 0011的反码就是为0111 1100。接下来在原先求负数补码的过程中,我们将式子化成1111 1111 - 1000 0011(在取反) + 0000 0001,那么在这种求负数补码的过程也可以是将负数原码取反后再加一,这也是一般求负数补码的方法。

        而有了补码这种概念后,我们会发现+0的补码是0000 0000,而-0的原码为1000 0000,通过取反加一后我们会发现-0的补码竟然也是0000 0000,正好解决了会出现两个零的可能,而且其中-128的补码是1000 0000(可以带入式子算,其中-128的原码也为1000 0000,所以可以算出其补码正好为1000 0000)。所以补码能够使每个数一一对应,这也是计算机储存数据使用补码而不是用原码。