计算机编码与浮点数

来源:互联网 发布:淘宝被扣48分保证金 编辑:程序博客网 时间:2024/04/30 12:33

数据的编码

数据表示当中的编码问题在计算机当中所使用的数据编码和我们日常生活中用到数据有一定的区别和差异这里我总结了下计算机当中所用到的几种编码其中就有,原码、反码、补码、移码。

源码如何计算得来呢? 就是我们把一个数转成二进制的表达形式,且把二进制的首位也就是最高位比如确定多少个字节来存这个数据如果是1个字节就是8个比特位,它的首位就是最高位最左边的一位,如果转成二进制不足8位王高位补0就可以了。

十进制  :1    原码二进制 就是  0000 0001    最高位为符号位,对于正数而言  符号位是0   ,对于负数而言符号位为1.

十进制 :-1    原码二进制就是  1000 0001  。。呵呵 我们发现有个问题 。

1 + (-1) 应该等于0的。但是用源码这样的操作往往行不通,变成二进制等于  1000 0010  变成了 -2的原码了。

所以像原码这种东西是不能够在计算机里面进行运算的。所以提出来了后面其他的编码方式、如反码

反码:也是区分正负的,对于正数:反码和源码表示是一样的。    包括后面的补码对于正数和源码也是完全相等的这一点 请大家一定要记住:原码、反码、补码 对于正数是一样的,负数就有差别。

十进制 :1    反码二进制是 :0000    0001    与源码一样最高位是符号位 0代表正数

反码对于负数:先把符号位单独处理 符号位不动  1 代表负数,然后把后面的所有位置按位取反(即这个位原来是0 改成1,是1改成0)。

十进制 :-1   反码二进制:1111  1110         最高位是符号位 1代表负数后面所有位按位取反。  。。。呵呵 我们发现


1 +(-1)    应该等于0。但是用反码 的结果是   0000 00001    +1111 1110     =     1111  1111      首先这是负数,然后其他位取反得到原始值 , 取反后等于 0, 结果计算出来的是负0 。 这已经跟我们的结果是匹配的了。但是看起来有些怪异,因为0 就是0  不应该分 正0 和负0。  

补码 :上面说了 对于正数 原码、反码 、补码都一样,补码对于负数实在反码的基础上加1.这就是补码。下面单独说下负数的补码如下:

十进制: -1      补码二进制  : 1111 1111        负1  二进制最高是符号位 1  不动,其他位取反等于反码 然后再加1。

1+ (-1)  这时候计算机用补码相加:0000  0001   + 1111 1111   = 0000 0000   得到了8个0  正0  。这就符合了我们数学运算了。


移码:是在特定场合用到的,它用到在浮点运算当中的阶码,后面我专门说下浮点数。移码是如何产生的呢?

移码是在补码的基础上把首位做取反如 正数 1 :  补码 1    的二进制形式:0000  0001     移码  就把首位取反  1000 0001    。

同样 负1  :补码是  1111 1111     移码:0111 1111      。为什么要这么做呢?




原码、反码、补码的表示范围:

原码:



反码:

 


补码:




浮点数表示

Double  float 等都是浮点数类型那么浮点数在计算机中的表示表示如下图:

 其中M为尾数,e为指数,R为基数  。从公式可以看出尾数M 保证了精度。

如:1000  + 119 浮点数 计算方法如下


  

对阶       ====》      尾数计算   =====》    结果格式化


对阶就是指数需要相同,尾数才可以相加。怎么对阶呢?是把1000的指数划成10的2次方还是 119的指数化成10的2次方呢。如果把1000的指数划成10的2次方的话,那么就得把尾数变成 10.0  。虽然结果是对的但是根据经验来看 10.0+1.19 =11.19  ,结果格式化时候还得划成1.119 * 10的3次方,做了无用功 ,所以一般是从低的往高的对阶。


  这样阶就对等了,这样尾数相加就可以了。





最后进行结果格式化

结果格式化是考虑到这个结果不符合浮点运算规则比方说我们结果是:

 那么就得做结果格式化就得改成:就是说必须确保小数点左边位置不能是0,且只有1位数字。


原创粉丝点击