C语言之深入存储——浮点数在内存中的存储与读取

浮点数家族

浮点数家族包括float、double、long double类型,同整型一样,不同类型的浮点数也有所能表示的范围,可以在float.h文件中研究。

 IEEE754标准

国际标准IEEE(电气和电子工程协会)754规定了二进制浮点数V的表示形式——对于任意二进制浮点数,必能以以下形式表示:

(-1)^S*M*2^E

其中(-1)^S表示符号位,当S=0,(-1)^S=1,V为正数;当S=1,(-1)^S=-1,V为负数。

M表示有效数字,M大于等于1,小于2。

2^E表示指数位。

下面来举个例子:例如十进制浮点数5.5如何表示为以上标准呢?

首先整数位写成101,这是很显然的。那么小数位的5是否也为101呢?其实不然,0.5=2^(-1),因此,将5.5表示成标准形式即为101.1,相当于(-1)^0*1.011*2^2,此时S=0,M=1.011,E=2。

浮点数的存储

IEEE754分别对32位浮点数与64位浮点数的存储有所规定。

对于32位浮点数:最高的1位记录符号S,随后的8位记录指数E,剩下的23位记录有效数字M。

对于64位浮点数:最高的1位记录符号S,随后的11位记录指数E,剩下的52位记录有效数字M。

 特别规定

1.在计算机内部保存M时,默认这个数的第一位总是1,如1.011,因此第一位的1可被省去,只需要保存小数点后面的位,在读取的时候加上第一位的1即可。这样一来就可以在有限的空间下多保存一位有效数字。

2.对于指数E的存储,将其作为无符号整数看待。可是E是有可能为负值的,这样一来不就取不到负值了吗?不用担心,IEEE754已经规定好了,存入内存时E的真实值必须加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。例如当指数为-1时,在8位的情况下,只需要存入-1+127,也就是126即可。

浮点数的读取

对于大多数情况,浮点数的读取只需要根据IEEE754标准反推就可以得到真实值。即当E不为全0且不为全1时,指数E的计算值减去127(或1023)得到真实指数值。有效数字M加上第一位的1得到真实有效数字。

例如之前提过的5.5在内存中的存储:

 S为0,即为正数,E= (1000 0001)129 - 127 = 2,M = 1.011。因此就是(-1)^0*1.011*2^2 = 101.1也就是5。

此外还有两种特殊情况

(1)E全为0(指数非常小):浮点数的指数E以1-127(1-1023)为真实值,有效数字M不再加上第一位的1,变成0.xxxxxx。使得计算出来的值为+-0,以及接近于0的很小的数字。

(2)E全为1(指数非常大):有效数字M为全0,表示+-无穷大。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树獭想吃饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值