C语言---浮点数在内存中的存储

news2024/11/27 22:42:50

前面跟大家介绍了整数在内存中的存储,这次再向大家介绍下浮点数在内存中的存储。

我们常见的浮点数有3.14,1E10 等等,浮点数家族包括float,double,long double类型。

浮点数的表示范围在头文件 float.h 定义。

1.浮点数的储存

首先,我们要清楚浮点数于整数在内存中的存储方式是完全不一样的。

浮点数在内存的存储方式有一个国际标准。

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V都可以表示成以下形式:

V  =  (-1)^{S}*M*2^{E}
1.  (-1)^{S} 表示符号位,当S=0时,V为正数,当S=1时,V为负数。
2. M 表示有效数字,M是大于等于1,小于2的。
3. 2^{E} 表示指数位。
举个例子
十进制的 5.5 ,写成二进制位 101.1,相当于 1.01*2^2。
那么按照上面的公式,得到
S=0,M=1.01,E=2。
再举个例子
-5.0
-5.0的二进制形式为-101.0,相当于-1.01*2^2。
根据公式可得S=1,M=1.01,E=2。
上面我们求得S,M,E,就是浮点数在内存中得存储方式。
且IEEE 754规定:
对于32位浮点数(float),最高的一位存储符号位S,接着8位存储指数E,剩下的23位存储有效数字M。如下图

对于64位浮点数(double),最高的一位存储符号位S,接着11位存储指数E,剩下的 52位存储有效数字M。如下图

2.浮点数存的过程

IEEE 754 对有效数字M和指数E,还有一些特别的规定。

前面我们说过,M是大于等于1且小于2的,也就是说M总是写成1.xxxxx的形式,其中xxxxx表示小数部分。IEEE 754 规定 再存储有效数字M的时候只存储其xxxxx小数部分,因为其整数部分被默认为1了。 比如当M=1.01时,我们只将01存储到内存中,等到读取的再将1补上去就行了。这样做的目的是节省一位有效数字位,让其精确度更高。这样我们就清楚了为什么float被称作单精度浮点数,double被称为双精度浮点数了,因为double类型的浮点数在存储时的精确度更高。

至于指数E,情况就有颠覆炸。

首先,规定E是一个无符号整数

这就意味着,如果E为8位,它的取值范围0~255,如果E为11位,它的取值范围0~2047。

但是我们知道,在科学计数法中,指数E是可以为负数的。所以 IEEE 754 规定E在存储到内存的过程中要加上一个中间数。

对于8位的E,中间数位127。对于11位的E,中间数为1023。

例如:2^10的E=10,所以保存成32位浮点数的时候,要加上127,变成137,即10001001。

3.浮点数取的过程

指数E在内存中取出可以分成三种情况。

E不全为0或不全为1

这种情况就属于一种正常情况。我们只要将E减上127或者1023,得到真实值,再将有效数字M前加上1。ru

比如:0.5

0.5的二进制为0.1,由于规定正数部分必须为1,则写成1.0*2^-1。

则E= -1+127=126,表示为01111110,尾数部分要去掉整数部分1,为0,又因为M要存到23位,则补0,则二进制表示形式为: 0 01111110 00000000000000000000000  如下图

这也是其在内存中存储的形式。

上面是0.5存储到内存中的过程。

我们的时候取出来,发现其E不全为0或不全为1,我们将浮点数从内存中取出来的步骤和存进去的步骤相反 E为01111110 ,转换为10进制为 126,再用126-127= -1,然后将M的整数部分1补上去。最终得到 (-1)^0*1.0*2^-1,计算的0.5。

E全为0时

当E全为0时,真实E就是一个非常小的数字了,因为前面我们说过E在存入内存中,要加上一个中间数127或者1023,如果加上这个中间数E在内存中还为0的话,E的真实值为1-127或1-1023了,这时E就是一个非常小的数字了,这时也不会将M的整数部分1不上去了,这时,原来的浮点数就是一个非常逼近0的数字了,一般情况下都会默认等于0。

E全为1

当E全为1时,则表示原数无穷大。

比如算32位浮点数时,真实E为255-127=128。然而2的32次方就已经42亿多了,更别提2的128次方了。

练习题

int main()
{
 int n = 9;
 float *pFloat = (float *)&n;
 printf("n的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 *pFloat = 9.0;
 printf("num的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 return 0;
}

看到题,不要慌张,我们要冷静分析。

首先,我们创建了一个变量n,n的值为9,you

写成其二进制形式: 00000000000000000000000000001001

后来又创建了一个float 类型的指针存储了n,这时内存已经将n看作一个浮点数存储在内存中了,

这时内存中默认存的是浮点数了,将原来的二进制看成浮点数的形式,观察发现E全为0,所以当以%f 的形式打印时,会默认为0。

接着分析,

后来有对pfloat指针进行解引用,将9.0赋值给指针 。

由于是直接将9.0存储到float类型中,这时候直接用浮点数存储到内存中的方式。

将9.0转换为二进制:1001.0

在写成科学计数法的形式:1.001*2^3。由此得到 S=0,M=1.001,E=3

由于是计算的是32位浮点数,E要加上127,得到130,130的二进制表示形式位:10000010,然后M要去掉整数部分得001,因为M要存23位,在001后面补20个0。

得到完整形式为0 10000010 00100000000000000000000

这就是此时9.0在内存中的存储形式。

当后面以%d形式打印时,要以有符号整型的形式打印,这时上面的二进制就会被认作是9.0的补码,由于无符号数的原码,反码,补码相同,由上面二进制计算可得应该是一个非常大的数字。

当以%f的的格式化打印时,上面的二进制就是浮点数的存储形式的,原来是9.0,打印时也是9.0

运行代码,如下图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1577135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录一次hss不能防护主机的问题

场景:hss的控制台显示不在防护中,其他云主机并没有这个情况。 故障发生的时间是昨天下午15点半左右,运维同事做了重启网卡的操作。service network restart 排查分析: 于是仔细的查看日志,发现报错如下&#xff1a…

中颖51芯片学习3. 定时器

中颖51芯片学习3. 定时器 一、SH79F9476定时器简介1. 简介2. 定时器运行模式 二、定时器21. 说明(1)时钟(2)工作模式 2. 寄存器(1)控制寄存器 T2CON(2)定时器2模式控制寄存器 T2MOD …

【NOI】二叉树的定义与基本性质

文章目录 前言一、二叉树的定义1. 树的定义2. 二叉树的定义 二、满二叉树、完全二叉树和非完全二叉树1.满二叉树2.完全二叉树3.非完全二叉树 三、二叉树的性质性质1: 在二叉树的第i层上至多有2^(i-1)个结点 (i≥1)。性质2: 深度为h的二叉树至多有2^h - 1个结点 (h≥1)。性质3: …

超越基准 | 基于每个高斯变形的3D高斯溅射方法及其高效训练策略

作者:小柠檬 | 来源:3DCV 在公众号「3DCV」后台,回复「原论文」可获取论文pdf 添加微信:dddvision,备注:3D高斯,拉你入群。文末附行业细分群 详细内容请关注3DCV 3D视觉精品课程:…

【java面试题-Redis篇-2024】

##java面试题大全 详细面试题-持续更新中-点击跳转 点赞、收藏、加关注 java基础面试题 ##java面试题大全1、什么是 Redis2、Redis 的数据结构类型3、Redis 为什么快4、什么是跳跃表5、什么是 I/O 多路复用6、什么是缓存击穿、缓存穿透、缓存雪崩7、什么是布隆过滤器8、热…

蓝桥杯考前复习三

1.约数个数 由乘法原理可以得出&#xff1a; import java.util.*; public class Main{static int mod (int)1e9 7;public static void main(String[] args){Map<Integer,Integer> map new HashMap<>(); //创建一个哈希表Scanner scan new Scanner(System.in);i…

只需三步,本地打造自己的AI个人专属知识库

一、引言 本文会手把手教你如何部署本地大模型以及搭建个人知识库&#xff0c;使用到的工具和软件有 OllamaOpen WebUIDockerAnythingLLM 本文主要分享三点 如何用Ollama在本地运行大模型使用现代Web UI和本地大模型"聊天"如何打造完全本地化的知识库&#xff1a…

突破视野限制 | 利用4D雷达进行SLAM的循环闭合检测

作者&#xff1a;小柠檬 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文pdf 添加微信&#xff1a;dddvision&#xff0c;备注&#xff1a;3D高斯&#xff0c;拉你入群。文末附行业细分群 详细内容请关注3DCV 3D视觉精品课程&#xff1a;…

14届蓝桥杯 C/C++ B组 T7 子串简写 (字符串)

采用存储目标字符下标的方法&#xff0c;此题的想法比较新奇&#xff0c;故予以记录。 存好下标之后&#xff0c;可以先定位好启始的字符&#xff0c;然后去搜结尾字符符合长度k并且最靠近启始字符的下标&#xff0c;找到之后可以直接取到这个下标之后的所有下标&#xff0c;因…

4.6java学习总结

内部类(补充) 局部内部类 如果在外界定义会检测不到你所定义的局部内部类,直接报错. public class Main {public static void print(int age,int b){class person{int age;public person(int age) {this.age age;}void show(){System.out.println("内部类输出: "a…

探索Flutter混淆在提高应用安全性方面的作用

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

ESP32调试笔记

目录 基于Thonny和micropythonESP32-CAM开发板无法连接Thonnyesp32cam局域网图传esp32代码上位机代码 基于Thonny和micropython ESP32-CAM开发板无法连接Thonny esp32cam有两个模式&#xff1a;下载模式、运行模式 两种模式的接线不同 IO0 短路 GND ! 正是因为两种模式接线…

LeetCode第十五题:三数之和【15/1000 python】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 LeetCode解锁1000题: 打怪升级之旅htt…

第十二届蓝桥杯大赛软件赛省赛C/C++大学B组

第十二届蓝桥杯大赛软件赛省赛C/C 大学 B 组 文章目录 第十二届蓝桥杯大赛软件赛省赛C/C 大学 B 组1、空间2、卡片3、直线4、货物摆放5、路径6、时间显示7、砝码称重8、杨辉三角形9、双向排序10、括号序列 1、空间 1MB 1024KB 1KB 1024byte 1byte8bit // cout<<"2…

软考-系统集成项目管理中级-新一代信息技术

本章历年考题分值统计 本章重点常考知识点汇总清单(掌握部分可直接理解记忆) 本章历年考题及答案解析 32、2019 年上半年第 23 题 云计算通过网络提供可动态伸缩的廉价计算能力&#xff0c;(23)不属于云计算的特点。 A.虚拟化 B.高可扩展性 C.按需服务 D.优化本地存储 【参考…

软件测试经典面试题:如何测微信的朋友圈?

这是一道非常经典的面试题&#xff0c;相信很多小伙伴在面试中都被面试官问到过这个问题&#xff0c;想要回答好这个面试题&#xff0c;我们首先要搞清楚面试官在考察候选者什么方向测试技能。其实不难猜出&#xff0c;面试官主要是想考察候选者测试用例设计能力。一般会从以下…

【游戏逆向】逆向基础之发包函数和线程发包

网络游戏是需要服务器的&#xff0c;这样才能玩家之间&#xff0c;服务器和玩家之间进行通信。 所以&#xff0c;我们的很多动作&#xff0c;都是要向服务器发包的&#xff0c;那么我们只要能够锁定正确的发包函数&#xff0c;就能很容易的通过调用关系找到该动作的函数&…

Springboot整合tess4j+tesseract实现OCR(文字识别),最新教程!

前言 不用引入什么dll&#xff0c;以及各种乱七八糟的东西。不废话&#xff0c;直接开始教程&#xff01;没有过多讲解里面的知识点&#xff0c;如有需要详细了解请加Qq:1101165230 1、Linux下安装与使用 1.1 安装tesseract&#xff08;复制粘贴敲回车&#xff0c;中间输入Y&…

王权与自由国际服测试资格申请 王权与自由steam国际服预约教程

《王权与自由》是一款由《剑灵》开发商NCsoft公开的旗下大型多人MMORPG新作游戏作品。攻城战&#xff0c;这是游戏中的一个重要玩法&#xff0c;主要分为攻城方和防守方。攻城方需要占领外城的遗址&#xff0c;并利用高轮&#xff08;包括碎石机、跳跃者和战斗航母&#xff09;…

JavaEE初阶之单例模式详解

目录 题外话 正题 单例模式 概念 优点 缺点 饿汉式单例模式 代码及详解 懒汉式单例模式 代码及详解 小结 题外话 昨天爬山去了,回来吃了个烧烤有点累,昨天旷了一天,每周稳定发个五篇文章是没什么太大问题的 正题 单例模式 概念 是一种常见的软件设计模式,确保一个类…