补码、原码、反码

来源:互联网 发布:艺术家 知乎 编辑:程序博客网 时间:2024/05/22 15:05

补码、原码、反码

原码:就是数字的二进制表现形式。

17:10001

28:  11100

二进制转十进制:系数*2n

n是从右往左,从0开始计数。

1     1     1     1     1     1     1     1

1     0     1     1     0     1     1     0

快速运算:每一位都是前一位的2的倍数,将递增规律带入二进制中,可以迅速的算出结果。

1     0     0     0     0     0     0     0     0     28

1     1     1     1     1     1     1     1  八位二进制能表示的最大数

=                                                      1

1     1     0     1     0     1     1     1     使用减法运算

255 – 32 -8 = 215;.

正数的原码:二进制的表现形式,最高位是0

负数的原码:

绝对值的二进制数据,符号位变为1.

5:   0000 0101

-5:  1000 0101

 

在计算机中,数据都是补码形式存在的。

正数的补码、反码和原码一致。

负数的反码:

       最高位(符号位)不变,然后其他位取反(0变1,1变0)

负数的补码:

       反码+1;

       原码最高位不变,然后其他位取反,再加1.

因为计算机中,数据都是补码形式存在,那么当对这些数据进行位运算的时候,就应该是对他们的补码来进行运算,而不是针对原码运算。

       例子:

              -10>>2=

              1000 1010->转补码:11110110 >>2 =11111101à转回原码

                                                                                      10000011=-3

为什么使用补码就可以达到减法运算的目的呢?

这里提出一个模概念:取值范围,当表示的数据超过了范围,超过范围的数据不要了。

简单的说,从8到2,我们一般是用8-6=2没问题,但是我们用加法怎么达到这个目的呢?我们可以这样,从8开始数,8、9、10、11、12,OK,到现在已经是12了,个位是2,因为我们的局限范围是个位,那么把十位的1扔掉,就剩下了2,这样是不是达到目的了?

再举个例子,时钟从3点到1点,我们只需要逆时针拨动2个格即可,但是,我们顺时针拨动10个格是不是也到达1点了?

计算机中因为电路设计的问题,无法使用减法,那么就使用补码的加法运算,来达到原码减法的结果。

1111 1111

+1

=1 00000000   //这个1超过了数据表示范围,不要了,那么他的值是0

 

1111 1111

+10

=1 00000001

举个例子,以8位进制数进行运算:

30-10 = 20

原码:

0001 1110        //30

-      1000 1010       //10负数的原码是其正数原码最高位取反

变成补码进行运算,发现最高位超出了,那么就舍去,因为该最高位不在本次运算数据表示范围

0001 1110

+  1111 0110

1 00010100

转回原码:00010100 –>20

0 0
原创粉丝点击