(C语言)浮点数在内存中的存储详解

1. 浮点数

常见的浮点数:3.14159、 1E10等 ,浮点数家族包括:  floatdoublelong double 类型。

浮点数表示的范围: float.h  中定义.

2. 浮点数的存储

我们先来看一串代码:

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;
}

想一想输出结果是什么?

出乎我们的意料。

原因在于浮点数的存储方式与整形有很大不同,下面我们来看一下。

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

V  = (−1)S   M  2E

.   (−1)S  表示符号位  当S=0 ,V为正数; 当S=1 ,V为负数

.  M 表示有效数字 ,M是大于等于1 ,小于2的

.  2E 表示指数位

举例来说:

十进制的5.0 ,写成二进制是 101.0 ,相当于 1.01*2^2  。那么 ,按照上面V的格式 ,可以得出S=0 ,M=1.01 ,E=2

十进制的-5.0 ,写成二进制是 -101.0 ,相当于  -1.01*2^2 。那么 ,S=1 ,M=1.01 ,E=2。

IEEE 754规定:对于32位的浮点数 ,最高的1位存储符号位S ,接着的8位存储指数E ,剩下的23位存储有效数字M ; 对于64位的浮点数 ,最高的1位存储符号位S,接着11位存储指数E,剩下的52位存储有效数字M

32位情况:

64位情况:

3。 浮点数的存储过程

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

前面说过 ,1<=M<2 也就是说 ,M可以写成1.xxxxxxx的形式 ,其中xxxxxxxxxx表示小数分。IEEE 754 规定 ,在计算机内部保存M时 ,默认这个数的第一位总是1 ,因此可以被舍去 ,只保存后面的 xxxxxx部分。 比如保存1.01的时候 ,只保存01 ,等到读取的时候 ,再把第一位的1加上去。这样做的目 ,是节省1位有效数字。 以32位浮点数为例 ,留给M只有23位 ,将第一位的1舍去以后 ,等于可以保存24位有效数字。

至于指数E ,情况就比较复杂首先 ,E为一个无符号整数(unsigned int)。这意味着 ,如果E为8位 ,它的取值范围为0~255;如果E为11位 ,它的取值范围为0~2047。但是 ,我们知道 ,科学计数法中的E是可以出现负数的 ,所以IEEE 754规定 ,存入内存时E的真实值必须再加上 一个中间数 ,对于8位的E ,这个中间数是127;对于11位的E ,这个中间数是1023。 比如 ,2^10的E是 10 ,所以保存成32位浮点数时 ,必须保存成10+127=137 ,即10001001。

4. 浮点数取的过程

指数E从内存中取出还可以再分成三种情况:

4.1 E不全为0或不全为1

这时 ,浮点数就采用下面的规则表示 ,即指数E的计算值减去127(或1023), 得到真实值 ,再将有效 数字M前加上第一位的1。

比如:0.5 的二进制形式为0.1  由于规定正数部分必须为1 ,即将小数点右移1位 则为1.0*2^(-1) ,其阶码为-1+127(中间值)=126 ,表示为01111110 ,而尾数1.0去掉整数部分为0 ,补齐0到23位 00000000000000000000000 ,则其二进制表示形式为:

0 01111110 00000000000000000000000

4.2 E全为0

这时不用管E ,浮点数的指数E直接等于1-127(或者1-1023) 即为真实值 ,有效数字M不再加上第一位的1 ,而是还 原为0.xxxxxx的小数。这样做是为了表示±0 ,以及接近于0的很小的数字。类似无穷小。

0 00000000 00100000000000000000000

4.3 E全为1

这时 ,即使有效数字M全为0 ,也表示±无穷大(正负取决于符号位s);

0 11111111 00010000000000000000000

我们学习了浮点数的存储下面我们回过头来看看前面的那道题目

5. 题目解析:

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;
}

先看第1环节 ,为什么 9 还原成浮点数 ,就成了0.000000。 9以整型的形式存储在内存中 ,得到如下二进制序列:0000 0000 0000 0000 0000 0000 0000 1001

首先 ,将9的二进制序列按照浮点数的形式拆分 ,得到第一位符号位s=0 ,后面8位的指数E=00000000。后23位的有效数字M=000 0000 0000 0000 0000 1001。由于指数E全为0 ,所以符合E为全0的情况。 因此 浮点数V就写成:

V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146)

显然 ,V是一个很小的接近于0的正数 ,所以用十进制小数表示就是0.000000。

再看第2环节 ,浮点数9.0 ,为什么整数打印是 1091567616

首先 ,浮点数9.0 等于二进制的1001.0 ,即换算成科学计数法是: 1.001×2^3

所以: 9.0 = (−1)0   (1.001) ∗ 23 

那么 ,第一位的符号位S=0 ,有效数字M等于001后面再加20个0 ,凑满23位 ,指数E等于3+127=130, 即10000010。所以 ,写成二进制形式 ,应该是S+E+M ,即

0 10000010 001 0000 0000 0000 0000 0000

这个32位的二进制数 ,被当做整数来解析的时候 ,就是整数在内存中的补 ,原码正是1091567616。

感谢观看,欢迎在评论区讨论。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分页多线程处理大批量数据

1.业务场景 因为需要从一个返利明细表中获取大量的数据&#xff0c;生成返利报告&#xff0c;耗时相对较久&#xff0c;作为后台任务执行。但是后台任务如果不用多线程处理&#xff0c;也会要很长时间才能处理完。 另外考虑到数据量大&#xff0c;不能一次查询所有数据在内存…

分布式Raft原理详解,从不同角色视角分析相关状态

分布式Raft原理详解&#xff0c;从不同角色视角分析相关状态 1. CAP定理2.Raft 要解决的问题3. Raft的核心逻辑3.1. Raft的核心逻辑2.1. 复制状态机2.2. 任期 Term2.3. 任期的意义&#xff1a;逻辑时钟2.4 选举定时器 3. Leader选举逻辑4. 从节点视角查看Leader选举4.1. Follow…

qt+ffmpeg 实现音视频播放(三)之视频播放

一、视频播放流程 &#xff08;PS&#xff1a;视频的播放流程跟音频的及其相似&#xff01;&#xff01;&#xff09; 1、打开视频文件 通过 avformat_open_input() 打开媒体文件并分配和初始化 AVFormatContext 结构体。 函数原型如下&#xff1a; int avformat_open_inpu…

ideaSSM 工程车辆人员管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 工程车辆人员管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具 有完整的源代码和数据库&…

[AIGC] 在Spring Boot中指定请求体格式

在使用Spring Boot开发Web应用的时候&#xff0c;我们经常会遇到需要接收并处理HTTP请求的情况。一个HTTP请求通常包括一个请求行、若干请求头和一个请求体。请求体在POST和PUT请求中特别重要&#xff0c;因为它通常用于向服务器传递数据。 文章目录 创建并使用一个Java Bean指…

计算机二级Python基础操作题

题目来源&#xff1a;计算机二级Python半个月抱佛脚大法&#xff08;内呈上真题版&#xff09; - 知乎 第4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;9&#xff0c;10&#xff0c;11套 1. 基础题1 sinput() print("{:\"^30x}".format(eval(s))) b …

【S5PV210】 | GPIO编程

【S5PV210】 | GPIO编程 时间:2024年3月17日22:02:32 目录 文章目录 【`S5PV210`】 | `GPIO`编程目录1.参考2.`DataSheet`2.1.概述2.1.1.特色2.1.2 输入/输出配置2.1.3 `S5PV210` 输入/输出类型2.1.4 IO驱动强度**2.1.4.1 类型A IO驱动强度****2.1.4.2 类型A IO驱动强度****2…

Selenium不同版本配置自动下载驱动及打包细节

Selenium配置浏览器驱动 自动下载浏览器驱动的方法 selenium4.7.0自动下载浏览器驱动的方法 selenium4.11.0 或4.11.1手动设置浏览器驱动路径的方法pyinstaller打包程序时同时打包ChromeDriverchromedriver路径需要sys._MEIPASS的路径进行引用方法一&#xff1a;通过–add-data…

LiveGBS流媒体平台GB/T28181功能-HTTPS 服务支持配置开启什么时候需要开启HTTPS测试SSL证书配置HTTPS测试证书

LiveGBS功能支持HTTPS 服务支持配置开启什么时候需要开启HTTPS测试SSL证书配置HTTPS测试证书 1、配置开启HTTPS1.1、准备https证书1.1.1、选择Nginx类型证书下载 1.2、配置 LiveCMS 开启 HTTPS1.2.1 web页面配置1.2.2 配置文件配置 2、HTTPS测试证书3、验证HTTPS服务4、为什么要…

安防监控视频汇聚平台EasyCVR接入海康Ehome设备,设备在线但视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

python5:基于多进程的并发编程、基于协程的并发编程的学习笔记

进程 为什么要使用多进程&#xff1f;——GIL的存在&#xff0c;多线程实际不是并发执行 将任务分为两类&#xff1a;IO密集型&#xff08;多线程&#xff09;CPU密集型&#xff08;多进程&#xff09; 多进程的基本用法 concurrent.futures.process.ProcessPoolExecutor#进…

Airgorah:一款功能强大的WiFi安全审计工具

关于Airgorah Airgorah是一款功能强大的WiFi安全审计工具&#xff0c;该工具可以轻松发现和识别连接到无线接入点的客户端&#xff0c;并对特定的客户端执行身份验证攻击测试&#xff0c;捕捉WPA握手包&#xff0c;并尝试破解接入点的密码。在该工具的帮助下&#xff0c;广大研…

C语言联合体和枚举

前言 这篇博客就把剩下的两个自定义类型联合体和枚举好好总结一下&#xff0c;让我们好好看看联合体和枚举到底是什么 个人主页&#xff1a;小张同学zkf 若有问题 评论区见 感兴趣就关注一下吧 目录 1. 联合体 1.1 联合体类型的声明 1.2 联合体的特点 1.3 相同成员的结构体和联…

分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测

分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测 目录 分类预测 | Matlab实现PSO-KELM粒子群优化算法优化核极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现PSO-KELM粒子群优化算法优化核极限学习机分类预测(完整源…

ideaSSM 高校公寓交流员管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 高校公寓交流管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&…

C语言:自定义类型(结构体)

目录 一、结构的特殊声明二、结构的自引用三、结构体内存对齐1.对齐规则2.为什么存在内存对齐(1)平台原因 (移植原因)&#xff1a;(2)性能原因&#xff1a; 3.修改默认对齐数 四、结构体传参五、结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段使用的注意…

硬件工程师入门基础知识(四)多层陶瓷电容应用(三)

多层陶瓷电容应用(三) 1.开关电源输出滤波电容器如何选择和计算?2.线性电源和开关电源对于滤波电容的选择有何区别?3.哪些电路适合三端多层陶瓷电容?4.哪些电路适合金属支架多层陶瓷电容?1.开关电源输出滤波电容器如何选择和计算? 无论任何开关电源拓扑,其输出滤波的目…

乐得瑞科技PD协议芯片:OTG与充电并行,引领数据交互

在科技日新月异的今天&#xff0c;数据交互的方式对于我们的日常生活和工作都起到了至关重要的作用。但在OTG技术诞生之前&#xff0c;这一过程却显得相当繁琐和耗时。想象一下&#xff0c;你需要将数码相机的照片导入到笔记本电脑中&#xff0c;却不得不频繁地拔出内存卡&…

YOLOv5目标检测学习(6):源码解析之:训练部分train.py

文章目录 前言一、导入相关包与配置二、主函数main2.1 checks&#xff1a;检查rank值来判断是否打印参数、检查git仓库、检查包的安装2.2 判断是否恢复上一次模型训练提问&#xff1a;opt.data, opt.cfg, opt.hyp, opt.weights, opt.project各是什么&#xff1f; 2.3 DDP mode&…

基于JavaWeb+BS架构+SpringBoot+Vue+O2O生鲜食品订购小程序系统的设计和实现

基于JavaWebBS架构SpringBootVueO2O生鲜食品订购小程序系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图 文末获取源码 Lun文目录 目 录 摘 要 I Abstract II 1 绪 论 1 1.1课题研究背景及意义 1 1.2研究现状 1 1.3本论文的主要论文结构 3 2系统相关技术…