c语言中小数在内存中的存储

转至:https://blog.csdn.net/tqs_1220/article/details/73550899

首先看float和double在内存中是怎么存储的?

float:符号位(1位)+指数位(8位)+尾数位(23位)

范围:-2^-128 ~2^127  (-3.40E-38~3.40E+38)

double:符号位(1位)+指数位(11位)+尾数尾(52位)

范围:-2^-1024~2^1023(-1.79E-308~1.79E+308)

在计算机中整数的存储是大多数人能够轻易理解得,比如在数据宽度为1个字节时,如果整数表示无符号数时就是0--15.如果整数用作有符号数时:0000--01111代表十进制的0--7。而1000--1111表示从(-8)--(-1)。然而计算机存储数据的方式都是一样的,并没有区分有符号和无符号,是我们使用数据的人来确定它到底是有符号还是无符号。而有符号数据一般使用在 数据比较、数据运算等等,其他方面差别并不是很大。

       整数十分好理解,但是小数的存储就让人感到困难多了,很多不懂IEEE规则。我们不需要懂它的规则,我们只需要记住存储的方法,这样以后看到小数就能轻易地知道它在内存中是如何存储的了。具体分为下面几步:

1、知道如何将十进制的整数部分和小数部分化成二进制。

        整数就是不断除2得到余数,例:8的二进制可进行这样计算:

         8/2=4余数为0

         4/2=2余数为0

         2/2=1余数为0

         1/2=0余数为1

整数从下向上看,所以8的二进制数就是1000。

    小数对应的就是乘,例0.25的二进制可进行这样计算:

       0.25*2=0.5整数部分为0

       0.5*2=1.0 整数部分为1

        当小数部分为0时结束运算,像有些数据会一直进行这种运算例如0.4永远无法将小数部分化为0,所以就有了精度的概念。

 小数从上到下看,所以0.25的二进制数就是01。

2、知道小数的存储是32位数据的,其中位31是符号位;位30--位23表示指数部分;位22--位0表示尾数(下面会介绍)部分。

3、不管数据的正负,先按照它的绝对值将它表示为二进制形式,注意整数和小数部分用小数点分开。例如:8.25可表示的二进制形式为1000.01。

4、将8.25的二进制形式化为科学计数法形式:1.00001*2^3,其中左移指数为正,右移指数为负。

5、开始存数:

            符号位              指数部分(8位)                    尾数部分(23位)

  0                        00000000                00000000000000000000000

尾数部分:即化为科学计数法后的小数部分,如1.00001*2^3它的尾数部分就是00001,因为在化为二进制时是从高到低看下来的,所以在尾数部分存数时就是从高到低,8.25的尾数部分就是00001000000000000000000。

指数部分:指数部分的最高位存的是左移还是右移。左移为1,右移为0。同时将指数减一放到指数部分(指数部分最高位除外),1.00001*2^3的指数部分就是10000010。

符号部分:8.25为正数,存的是0。

        所以8.25在计算机中的的数据存储就是01000001000001000000000000000000

                  0100 0001 0000 0100 0000 0000 0000 0000===41040000

下面讲讲不带整数的小数是如何存储数据的。

          除开指数部分存储以外,其他步骤完全一样。我们举例说明:0.25

0.25的二进制形式为0.01,它化为科学计数法需要右移两位,即1.0*2^-2。

尾数部分全0。

指数部分最高位为0(右移)。

(-2)-1=-3=FD=11111101,去除最高位,将FD低七位和指数部分最高位合在一起,即0111 1101。

 

0.25的32位数据即:0011 1110 1000 0000 0000 0000 0000 0000==3E800000

猜你喜欢

转载自blog.csdn.net/qq_33436509/article/details/82462371