补码、原码、反码
原码:就是数字的二进制表现形式。
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