C语言之数据在内存中的存储(2),浮点数在内存中的存储


目录

前言

一、引例

二、浮点型在内存中的存储

三、浮点数在内存中的存和取过程

1.浮点数的存储过程

2.浮点数的取过程

四、引例解析

总结



前言

        想知道浮点数在内存中是如何存储的吗,本文就告诉你答案,虽然一般情况题目还是面试涉及到浮点数在内存中的存储很少,但是了解其存储机制有利于加深我们对C语言的理解,修炼我们的内功。


❤️感谢支持,点赞关注不迷路❤️


 

 

一、引例

我们看以下代码:

#include <stdio.h>int main()
{int n = 9;float* pFloat = (float*)&n;printf("n的值为:%d\n", n);printf("pFloat的值为:%f\n", *pFloat);*pFloat = 9.0;printf("n的值为:%d\n", n);printf("pFloat的值为:%f\n", *pFloat);return 0;
}

运行结果:

发现:我们观察到,将整数9以浮点型打印时为0.000000,将浮点型9.0以整形打印时是一个较大的数字。这一点就可以说明整形与浮点型在内存中的存储形式是不同的。


二、浮点型在内存中的存储

我们知道整数在内存中是以补码的形式储存的,那么浮点数是怎么存储的呢?

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

举例:浮点数5.5用以上形式如何表示:

  1. 首先5.5翻译成二进制为 101.1。
  2. 然后就可以改写成以下形式:
  3. 这时候,M就是1.011,E就是2,S自然为0


然后,只需要将S、M、E这三个数存储到内存中,就可以储存一个浮点数了,那么这三个数是如何在内存中存放的呢?

IEEE 754规定:

  • 对于32位的浮点数(float),最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数
  • 字M 对于64位的浮点数(double),最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

注意:不管怎样,内存中存储的还是补码


  

三、浮点数在内存中的存和取过程

1.浮点数的存储过程

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

M的存储过程:前面用101.1举例,可以写成类似科学计数法的形式。1<=M<2,也就是说,M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表表示小数部分。那么就有以下规定:

IEEE 754规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后面的 xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。

E的存储过程:指数E,情况就比较复杂首先,E为一个无符号整数(unsigned int),这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的。E又是无符号整数,所以规定:

IEEE754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是 10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

举例:浮点数(float)5.5,二进制位:101,1

  1. S:0,E:2,M:001
  2. 但是E存入内存时(float)要加上127等于129
  3. 结果就是 0 10000001 01100000000000000000000
  4. 注意:M后不够是补0的
  5. 0100 0000 1011 0000 0000 0000 0000 0000翻译为16进制为0x40 b0 00 00
  6. 然后我们在VS中调试观察,验证以下
  7. 因为VS是小端存储,所以是倒着存,结果一致


2.浮点数的取过程

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

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 00000000000000000000

2.E全为0(特殊情况)

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

比如1.0*2的负127次方,这个数无限接近于0,所以M读取时不再加上1,并且指数读取时是减126而不是127,因为M的整数位1被移到了小数部位,所以内存中为0 00000000 00000000000000000000000,读取时就是0.000000

3.E全为1(特殊情况)

这时,浮点数指数 E 等于128,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);

我们可以简单算一下,2的32次方大约42亿,那么4个42移相乘,那数字将会非常大。


四、引例解析

引例中的结果:

我们来一步一步分析:

  1. 首先 int n = 9,它在内存中的补码为:00000000 00000000 00000000 00001001。以%d打印肯定是9没毛病。
  2. 然后通过指针把它当做浮点型打印,这时编译器就会将n的补码以浮点数的格式进行读取,float为32个比特位,可以写成0 00000000 00000000000000000001001。
  3. 这里 E 的部分全为0,对应了上文第二种情况,E将无限接近于0,读取出来就是,0.9*2的负126次方,等于0.00000...9,而编译器默认打印小数点后6位,因此结果才为0.000000
  4. 通过指针将n的空间存的值修改为9.0,而9.0将会以32位浮点型的格式存储到内存中,9.0翻译为二进制为:1001.0,变为科学计数法为:1.001*2^3,那么S:0,E:3,M:1.001
  5. E存入内存要加上127等于130,二进制为:10000010,因此9.0存入内存的二进制为:0 10000010 00100000000000000000000
  6. 将 01000001000100000000000000000000以整形的格式读取时就为:
  7. 以浮点型%f读取就是正常9.0

所以我们在拿到一个数据时,非特殊一定要以正确的格式读取,否则就不是你想要的数字


总结

        以上就是本文的全部内容,希望对你有所帮助。

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

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

相关文章

新华三H3CNE网络工程师认证—ACL使用场景

ACL主要用于实现流量的过滤&#xff0c;业务中网络的需求不止局限于能够连同。 一、过略工具 你的公司当中有研发部门&#xff0c;包括有财务部门&#xff0c;财务部门的访问是要做到控制的&#xff0c;防止被攻击。 这种的过滤方法为&#xff0c;在设备侧可以基于访问需求来…

AI算力发展现状与趋势分析

综合算力发展现状与趋势分析 在数字经济的疾速推动下&#xff0c;综合算力作为驱动各类应用和服务的新型生产力&#xff0c;其价值日益凸显。我们深入探讨了综合算力的定义、重要性以及当前发展状况&#xff1b;并从算力形态、运力性能和存储技术等角度&#xff0c;预见了其发展…

基于Java技术的校友社交系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果你对校友社交系统感兴趣或者有相关需求&#xff0c;可以私信联系我。 开发语言 Java 数据库 MySQL 技术 Java技术SpringBoot框架 工具 IDEA/Eclipse、Navicat、Maven 系统展示 首页 校友会信息界面 校友活动…

Sqli-labs 3

1.按照路径http://localhost/sqli-labs/sqli-labs-master/Less-3/进入 2.判断注入类型----字符型 Payload&#xff1a;?id1’) and 11-- 注&#xff1a;根据报错提示的语法错误&#xff0c;在第一行中使用接近’union select 1,2,3--’)的正确语法 3.判断注入点&#xff1a;…

【Linux】vim详解

1.什么是vi/vim? 简单来说&#xff0c;vi是老式的文本编辑器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。vim则可以说是程序开发者的一项很好用的工具&#xff0c;就连 vim的官方网站&#xff08; http://www.vim.org&#xff09;自己也说vim是一…

区块链项目全球成功指南:全面覆盖的媒体宣发策略与实践

随着区块链技术的迅速普及和发展&#xff0c;全球范围内对区块链项目的关注度不断提升。为了在国际市场上取得成功&#xff0c;区块链项目需要通过有效的媒体宣传策略来提高知名度&#xff0c;吸引投资&#xff0c;并建立强大的社区支持。本文将详细介绍区块链项目在海外媒体宣…

为企业提升销售工作效率的工作手机管理系统

在竞争日益激烈的市场环境中&#xff0c;企业的销售团队如同前线战士&#xff0c;其作战效率直接关乎企业的生存与发展。然而&#xff0c;传统销售管理模式下的信息孤岛、沟通不畅、数据混乱等问题&#xff0c;正悄然成为制约销售效率提升的瓶颈。今天&#xff0c;我们为您揭秘…

在 Windows 平台搭建 MQTT 服务

引言 MQTT 是一种轻量级、基于发布/订阅模式的消息传输协议&#xff0c;旨在用极小的代码空间和网络带宽为物联网设备提供简单、可靠的消息传递服务。MQTT 经过多年的发展&#xff0c;如今已被广泛应用于资源开采、工业制造、移动通信、智能汽车等各行各业&#xff0c;使得 MQ…

汇聚荣做拼多多电商怎么样?

汇聚荣做拼多多电商怎么样?在当前电商平台竞争激烈的背景下&#xff0c;拼多多凭借其独特的商业模式和市场定位迅速崛起。对于想要加入拼多多的商家而言&#xff0c;了解平台的特点、优势及挑战是至关重要的。本文将深入分析加入拼多多电商的多个方面&#xff0c;帮助读者全面…

ubuntu计划任务反弹

目录 实验环境 实验步骤 目标主机构造任务计划 构造语句 语句解释 kali开启监听 监听成功 问题 原因 实验环境 攻击者 操作系统&#xff1a;kali IP&#xff1a;192.168.244.141 目标主机 操作系统&#xff1a;ubuntu IP&#xff1a;192.168.244.151 实验步骤 目…

论文学习_An Empirical Study of Deep Learning Models for Vulnerability Detection

1. 引言 研究背景:近年来,深度学习漏洞检测工具取得了可喜的成果。最先进的模型报告了 0.9 的 F1 分数,并且优于静态分析器。结果令人兴奋,因为深度学习可能会给软件保障带来革命性的变化。因此,IBM、谷歌和亚马逊等行业公司非常感兴趣,并投入巨资开发此类工具和数据集。…

(8)揭示Python编程精髓:深潜继承与多态的奇幻之旅

目录 1. 命名空间与作用域1.1 命名空间概述1.2 作用域1.2.1 局部作用域1.2.2 全局作用域1.2.3 修改全局变量1.2.4 嵌套作用域 2. 继承3. 多态&#xff08;Polymorphism&#xff09; 1. 命名空间与作用域 1.1 命名空间概述 命名空间是一个从名字到对象的映射&#xff0c;它在P…

Qt:19.浮动窗口/子窗口(子窗口介绍、代码方式创建子窗口、设置子窗口标题、为子窗口添加控件、设置子窗口停靠位置)

目录 1.子窗口介绍&#xff1a; 2.代码方式创建子窗口&#xff1a; 3.设置子窗口标题&#xff1a; 4.为子窗口添加控件&#xff1a; 5.设置子窗口停靠位置。 1.子窗口介绍&#xff1a; 在 Qt 中&#xff0c;可以创建和管理子窗口&#xff08;子窗口体&#xff09;以实现多窗…

图片怎么制作成长期可用的活码?扫码提供图片预览的制作技巧

现在图片的尺寸和清晰度的质量越来越高&#xff0c;相对应的会占用更多的存储空间&#xff0c;现在很多人会将图片存入云端后&#xff0c;通过生成二维码的方式&#xff0c;扫码来查看图片内容。图片转换二维码有利于将图片分享给其他人查看&#xff0c;还能够节省更多的空间&a…

SpringBoot自己开发一个starter

提示&#xff1a;本文主要讲述如何自行开发一个SpringBoot的starter 文章目录 目录 文章目录 前言 一、Starter是什么 二、创建一个SpringBoot项目 1.创建一个基本的SpringBoot项目 2.选择要下载的库 三、设置项目 1.提示 2.配置pom.xml 3.重点代码 1.创建一个User类…

16.x86游戏实战-汇编指令push pop pushad popad

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【第29章】MyBatis-Plus之分页插件

文章目录 前言一、支持的数据库二、配置方法三、属性介绍四、自定义 Mapper 方法中使用分页五、其他注意事项六、Page 类七、实战1. 配置类2. 分页类3. 测试 总结 前言 MyBatis-Plus 的分页插件 PaginationInnerInterceptor 提供了强大的分页功能&#xff0c;支持多种数据库&a…

Windows电脑安装Python结合内网穿透轻松搭建可公网访问私有网盘

文章目录 前言1.本地文件服务器搭建1.1.Python的安装和设置1.2.cpolar的安装和注册 2.本地文件服务器的发布2.1.Cpolar云端设置2.2.Cpolar本地设置 3.公网访问测试4.结语 前言 本文主要介绍如何在Windows系统电脑上使用python这样的简单程序语言&#xff0c;在自己的电脑上搭建…

电力需求预测挑战赛笔记 Taks1 跑通baseline

#AI夏令营 #Datawhale #夏令营 赛题 一句话介绍赛题任务可以这样理解赛题&#xff1a; 【训练时序预测模型助力电力需求预测】 电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。 赛题任务 给定多个房屋对应电力消耗历史 N 天的相关序列数…

09.AOP-尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)

现有代码缺陷 针对带日志功能的实现类&#xff0c;我们发现有如下缺陷&#xff1a; 对核心业务功能有干扰&#xff0c;导致程序员在开发核心业务功能时分散了精力附加功能分散在各个业务功能方法中&#xff0c;不利于统一维护 解决思路 解决核心&#xff1a;解耦。把附加功能从…