浮点数的存储形式

float在内存中的存储形式:

先看下面一道例题:

 

                 float *p = (float *)#

                printf( "num=%d\n", num);

                printf( "*p=%d\n", *p);


                *p = 5.0;

                printf( "num=%d\n", num);

                printf( "*p=%f\n", *p);

spacer.gif

wKiom1cJs0Hh-sUSAABjTlfWUhg718.png

这是因为float在计算机中的存储形式与int存储形式不同造成的:

对于float类型:

wKiom1cJs1WyJW78AABzZ65NSkk127.png

spacer.gif

例如:5.0(101)在内存中的存储形式是

             5.0=(-1)^0*(1.01)*2^2


          0 10000010 01000000000000000000000


有没有对指数位E感到奇怪呢?因为E占有8个bit位,取值范围是0-255,取不到负数,所以我们给E加上一个127再存到指数位中。这样就可以取到

负数。当我们读取这个时给E减去127就行了。


当E为全0时,表示一个接近0的数,因为E为全0时,M将不再加1,m为0.xxxxxxx...的形式,浮点数的指数为1-127,是一个非长小的数。

当E为全1时,如果M为全0,则表示一个正负无穷大的数。



现在对于上面的例题清楚了吧,同一个数分别以float和int的形式去看,看到的结果是不同的。



对于double形式,是一样的,只不过double是8个字节,64个bit位,所以double的指数位是11位(要加一个1023),有效位是52位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值