前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据在内存中的存储——浮点数

数据在内存中的存储——浮点数

作者头像
薛定谔方程难
发布2024-01-23 16:18:31
1580
发布2024-01-23 16:18:31
举报
文章被收录于专栏:我的C语言我的C语言

塞翁失马,焉知非福。——《淮南子·人间训》

1、介绍

常见的浮点数:3.1415926,1E10等,浮点数包含的类型有float,double,long double 浮点数的表示范围在头文件float.h中定义。

2、由题引入

下面,我们来看一段代码,来观察一下,究竟最后打印出来的是什么?

在这里插入图片描述
在这里插入图片描述

又是不经的发出疑问,为什么到这却是那么多和自己想的不一样的地方啊!到最后就只对了一半? 那么到这我们就应该想一下,到底是为什么,难道是之前对于整型的存储的理解到浮点数就不同了?难不成浮点数的存储方式,和我们想的完全不一样吗?

3、浮点数的储存

上面的代码中明明,num和*pFloat就是一个数,为什么浮点数和整数的解读结果会差别那么大? 那么为了搞清为什么是这样的结果,我们必须搞明白浮点数在计算机内部的表示方法。 根据国际标准IEEE(电气和电子工程协会)754 任意一个以二进制浮点数V可以表示成一下的形式

在这里插入图片描述
在这里插入图片描述

为了更好的理解,通过举例来说明 就以十进制的5.0来说,写为二进制的话是101.0,相当于是1.01 *2^2。 那按照上面的V的形式,可以得出S=0,M=1.01,E=2 相同的,那要是-5的话,写为二进制的话是-101.0,相当于是-1.01 *2^2。那么,S=1,M=1.01,E=2 同时IEEE754规定: 1、对于32位的浮点数来说,最高位的1位存储的是符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。 2、对于64位的浮点数来说,最高位的1位存储的是符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。 下面是对于32位来说的简图

在这里插入图片描述
在这里插入图片描述

下面是对于64位来说的简图

在这里插入图片描述
在这里插入图片描述

4、浮点数的存取的过程

4、1浮点数的存

由于对于M来说,已经规定了M的取值范围,1<M<=2的,所以对于M来说,既然必定会是1.xxxx什么的,那还有必要存储吗?有必要浪费一个字节吗,如果不存,还可以更精确。 所以根据IEEE规定,每次保存的时候都是把1舍去只保留小数点后面的数字。只有到时候读取的时候,才会把原来的1加上去。 但是对于E来说,还是情况比较复杂的 首先E是一个无符号的整型,由于是8/11个字节,所以取值范围应该是0~ 255/0~2047:但是难道所有的浮点数都是大于1的?难道科学计数法中就没有负数出现吗?很显然,当然是有的啊。所以IEEE又754规定了,对于存入的E的真实值必须加上一个中间值,对于8/11位的E来说,中间值是127/1023.比如,2^10的E是10,所以在保存成为32位的浮点数的时候,必须是10+127=137,保存10001001。

4、2浮点数的取

指数E从内存中取出的过程还可以分为三种情况: 1、E不全为0或者不全为1 那就按照上面的正常方法进行,先S后E最后M的方式一个个取出。 2、E全为0 那么这时,还得再减去127或者1023才能是最后的E,那么可想而知,会是一个很小的数字,那么此时,在有效数字M不会再前面加上第一位的1,相当于就是0.xxxx表示一个很小的数字,这也是方便来表示一个很小的数字。 3、E全为1 这是就相当于是上一个特例的反义词,表示无穷大的意思。

5、题目回顾

在这里插入图片描述
在这里插入图片描述

所以我们现在再来看这时候的题目,是不是有一种了解的感觉呢? 首先看第一部分,为什么 指针pFloat变为0? 其实,由于n是整型,所以在存储的时候就会是32个比特,会是 0000 0000 0000 0000 0000 0000 0000 1001 那么变为浮点数的时候,第一位是S=0,E=0此时应该是上面的E全为0的时候,应该是一个很小的数字,所以才会导致最后的结果是0.0000000 看第二部分 既然是浮点数的指针,那么存储的时候会是什么呢? 0(S) 10000010(E) 001 0000 0000 0000 0000 0000(M) 那这段数字转为二进制的整型之后,就是会变得很大,所以最后打印出来的会是那样。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、介绍
  • 2、由题引入
  • 3、浮点数的储存
  • 4、浮点数的存取的过程
    • 4、1浮点数的存
      • 4、2浮点数的取
        • 5、题目回顾
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档