浮点数的储存

limits.h头文件,介绍关于整型家族的内容。

float.h头文件,介绍浮点型家族的内容。

浮点数在储存的时候都可以写成(-1)^S*M*2^E

其中S用来判断正负,当S=0时,为正数,当S=1时,为负数。

M用来用来表示有效数字,1<=M<2。所以M一定是1.XXXXX。

2^E表示指数位。

所以在存储时,只要把S、M、E储存起来就行了

 

因为M第一位一定是1,所以储存时只要存1后面的数就可以了,这样可以储存的数字更精确。

假设存储一个5.5的数,换算成二进制的表达形式就是101.101,也就是1.01101*2^2,在M中存储的二进制位就是01101000000000000000000。

E是一个无符号整数,在32位时他的取值范围为0~255;64位时取值范围是0~2047; 但是实际上E的取值是可以出现负数的情况的,因此需要加一个中间值来区分正数和负数;32位时,8位的E中间值位127,64位时,11位的中间值为1023

假设E=-1,那么在储存的时候储存的是-1+127=126,存的是126;64位+1023。

取出E的时候

(1)当储存E的8个位或者11个位储存的不是全为0或者全为1 的时候,取出E然后-127或者1023得到E的值

(2)当储存E的8个位或者11个位储存的全为0时,-127+127=0,E=2^-127,那么将是一个非常小的数,默认位+/-0。

(3)当储存E的8个位或者11个位储存的全为1的时候,那么将是一个非常大的值,没有什么研究的意义。

用以上知识来解释一下下面这道例题

输出结果位什么呢?

若没有学习浮点数的存储之前,我们会觉得可能是:

输出:n的值为:9

           *pFloat的值为:9.000000

            num的值为:9.0

            *pFloat的值为:9.000000

但是实际上是:

 

 这是为什么呢?

第一行为9不做赘述,

第二行

内存中n=9;以整型二进制的形式来储存,为00000000000000000000000000001001

但是在第二行中,以浮点数的形式来表达

E所占的8个位是00000000,所以是一个很小的数,所以最后输出0.000000

第三行为什么是 1091567616呢

二进制位: 

也就是: 

我们以浮点数的形式将9.0存储进去了,但是第三行又以整数的形式表达出来

即01000001000100000000000000000000(这个是补码,因为储存的是补码,但是正数补码原码是一样的,所以这个也是原码)的十进制整型位1091567616

第四行就是正常的定义浮点数,打印浮点数。 

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值