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

news2024/9/29 15:19:01

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.coloradmin.cn/o/1541111.html

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

相关文章

高中信息技术教资刷题笔记_大题篇

1.选择排序 2. SMTP属于TCP/IP协议体系结构中的哪一层&#xff1f;请列出其通信的三个阶段。 3.高中信息技术课程的基本理念/意义 4.视频作品制作和发布的主要环节 5.信息社会责任内涵及学生表现 6.教学活动意图 ①突出学生的主体地位。材料中&#xff0c;王老师设计的“扮演谍…

关系型数据库mysql(4)事务

目录 一.事务的概念 1.事务的定义 2.事务的特点 2.1原子性 2.2一致性 2.4持久性 3.事务之间的相互影响 3.1脏读 3.2不可重复读 3.3幻读 3.4丢失更新 4. 事务的隔离级别&#xff08;如何解决事务的干扰&#xff09; 4.1查询全局事务隔离级别 4.2查询全局事务 …

【零基础C语言】联合体(共用体)和枚举

目录 自定义类型&#xff1a;联合体(共用体)和枚举 1.自定义类型&#xff1a;联合体(共用体) 1.1 联合体的声明 1.2 联合体的特点 ​编辑1.3 联合体的大小计算 1.4使⽤联合体是可以节省空间的 1.5使用联合体写一个程序判断机器是大端还是小端存储 2.自定义类型&#xff1a;…

详解|temu选品师是什么?算蓝海项目吗?

在快速发展的跨境电商行业中&#xff0c;temu选品师这一岗位逐渐受到人们的关注。temu作为拼多多旗下的跨境电商平台&#xff0c;致力于为中国商家提供一个通向全球市场的桥梁。而temu选品师&#xff0c;则是这个桥梁上不可或缺的角色。 temu选品师主要负责在海量商品中挑选出具…

探索Zalo:从社交APP到Mini App开发指南

1.Zalo是什么&#xff1f; Zalo是一款源自越南的即时通讯和社交软件&#xff08;相当于国内的微信&#xff09;&#xff0c;由越南VNG公司开发。它集成了多种功能&#xff0c;包括但不限于免费的文字、语音、视频消息发送&#xff0c;高质量的语音和视频通话&#xff0c;群聊功…

电子电器架构 —— 诊断数据DTC具体故障篇

电子电器架构 —— 诊断数据DTC起始篇 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎…

批量重命名文件名,批量管理文件,复制后轻松删除原文件

在现代工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;无论是工作文档、图片还是视频资料。对于很多人来说&#xff0c;文件管理是一项繁琐且耗时的任务。不过&#xff0c;现在有一种高效的文件管理方法&#xff0c;可以帮助你轻松复制文件后删除原文件夹&#xff0…

Redis入门到实战-第四弹

Redis实战热身Strings 篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理…

鸿蒙开发学习【地图位置服务组件】

简介 移动终端设备已经深入人们日常生活的方方面面&#xff0c;如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动&#xff0c;都离不开定位用户终端设备的位置。 当用户处于这些丰富的使用场景中时&#xff0c;系统的位置定位能力可以提供…

解析服务器出现大量 TIME_WAIT 和 CLOSE_WAIT 状态的原因及排查方法

服务器出现大量 TIME_WAIT 状态的原因有哪些&#xff1f; 首先要知道 TIME_WAIT 状态是主动关闭连接方才会出现的状态&#xff08;别陷入一个误区不是只有客户端才能主动关闭连接的&#xff09;&#xff0c;所以如果服务器出现大量的 TIME_WAIT 状态的 TCP 连接&#xff0c;就是…

分布式组件 Nacos

1.在之前的文章写过的就不用重复写。 写一些没有写过的新东西 2.细节 2.1命名空间 &#xff1a; 配置隔离 默认&#xff1a; public &#xff08;默认命名空间&#xff09;:默认新增所有的配置都在public空间下 2.1.1 开发 、测试 、生产&#xff1a;有不同的配置文件 比如…

关于mysql无法添加中文数据的问题以及解决方案

往数据库表插入语句时&#xff0c;插入中文字段&#xff0c;中文直接变成&#xff1f;的问题&#xff0c; 出现这样的问题就是在创建数据库时 数据库字符集 没有选择uft8, 数据库校对规则没有选择utf8-bin 用 SHOW CREATE DATABASE 数据名; 可以查看你的这个数据库的定义…

设计模式之状态模式(一)

设计模式专栏&#xff1a; http://t.csdnimg.cn/4Mt4u 目录 1.概述 2.结构 3.实现 4.总结 1.概述 状态模式( State Pattern)也称为状态机模式( State Machine pattern), 是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类, 属于行为型模式。 在状…

<商务世界>《第16课 餐桌礼仪之座次》

1 简要 我国自古以来就很重视座位礼仪&#xff0c;非讲究&#xff0c;分君臣、分宾主、分方位等等而今座位礼仪已经简化为&#xff1a; 以“中”为尊&#xff1a; 中心为尊&#xff0c;突出主位。 以“右”为尊&#xff1a; 从历史上到国际上都是以右为尊。 以“内”为尊&…

算法导论第十四章练习参考答案(26) - 14.1-14.3

Exercise 14.1-1 呼叫顺序为: OS−SELECT(T.root,10) OS−SELECT(T.root.left&#xff0c;10) OS−SELECT(T.root.left.right&#xff0c;2) OS−SELECT(T.root.left.right.left&#xff0c;2) OS−SELECT(T.root.left.right.left.right&#xff0c;1) 然后&#xff0c;我们得到…

UKP3d的协同设计相关问题

用户在用UKP3d多人协同设计&#xff0c;反映以前保存的内容为什么没有呢&#xff1f; 经查&#xff0c;协同设计的某一用户并没有打开协同去用。如A,B两人协同设计&#xff0c;B并不是用“打开—协同项目”&#xff0c;而是用“打开—项目”&#xff0c;当B保存项目的时候&…

RelativeContainer踩坑--子控件消失

使用android的RelativeLayout时&#xff0c;靠左靠上的子控件&#xff0c;我通常不会去声明它和父布局的约束关系。 结果这个方法用到鸿蒙RelativeContainer上出了问题&#xff0c;当我写第一个子控件时&#xff0c;没有声明与父布局的约束关系&#xff0c;显示是OK的 Relati…

NX二次开发-调内部函数创建进度条MT_create_progress_bar

一、概述 最近学习NX二次开发&#xff0c;看到NX打开装配模型或者加载模型时会显示进度条的问题&#xff0c;个人觉得很有意思&#xff0c;然后参考阿飞2018中的文章进行学习。 二、代码解析 //User Defined Header File#include <uf.h>#include <uf_ui.h>#includ…

Zookeeper(八)序列化与协议

目录 一 序列化与反序列化1.1 Jute序列化工具1.1 Recor接口1.2 OutputArchive和InputArchive 二 通信协议2.1 请求部分2.1.1 请求头2.2.2 请求体2.1.3 案例分析 2.2 响应部分2.2.1 响应头2.2.2 响应内容2.2.3 案例分析 官网&#xff1a;Apache ZooKeeper 一 序列化与反序列化 …

vivado 查看消息、增量编译消息、查看实施报告

查看消息 重要&#xff01;查看所有消息。这些信息可能会建议如何改进您的设计性能、功率、面积和布线。严重警告还可能暴露时间限制问题必须解决。 以非项目模式查看消息 在非项目模式下&#xff0c;查看Vivado日志文件&#xff08;Vivado.log&#xff09;中的以下内容&…