【C语言入门】浮点型数据在内存中的存储

news2025/1/12 18:57:20

✨✨欢迎大家来到Celia的博客✨✨

🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉

所属专栏:C语言

个人主页:Celia's blog~

目录

​编辑

引言

引例

一、浮点型在内存中的存储方式

1.1 国际标准IEEE754

1.2 浮点型在内存中的存储过程

1.2.1 单精度与双精度的存储模型

 1.2.2 有效数字 M 和指数 E 的特殊规定

(1)有效数字M

(2)指数E

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

2.1 E不全为0也不全为1

2.2 E全为0

2.3 E全为1

三、引例解析


 

引言

  我们知道,整型数据在内存中以补码的形式存储,字符型数据在内存中以ASCII码的形式存储,其本质都是一个二进制序列,但在C语言中,浮点型的存储方式与其他数据类型大不相同,本篇文章将会简单介绍浮点型数据在内存中的存储方式。

引例

  我们先来看接下来的代码,它的输出结果是什么?

#include<stdio.h>
int main()
{
	int a = 5;

	float* p = (float*)&a;
	printf("%f\n", *p);//打印指针p所指向的数据
	*p = 6.0;
	printf("%d\n", a);//以整型形式打印a变量
	return 0;
}

 运行结果:

是不是和预想的不同?这个例子能有效地证明浮点型数据在内存中有着独特的存储方式。

一、浮点型在内存中的存储方式

1.1 国际标准IEEE754

“IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用,IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。”

  国际标准IEEE(电气和电子工程协会)754规定了任意一个浮点数都可以表示成以下的形式:

  • V = (-1)^S  *  M  *  2^E
  • (-1)^S表示符号位,用于表示正负
  • M为有效数字(1<M<2)
  • 2^E表示指数位

比如:

  • 十进制的5.0可以表示成二进制为:101.0,相当于(-1)^0 * 1.01 * 2^2
  • 按照以上形式:S=0,M=1.01,E=2
  • 所以浮点型的存储可以理解为是对S,M,E的存储

1.2 浮点型在内存中的存储过程

1.2.1 单精度与双精度的存储模型

 1.2.2 有效数字 M 和指数 E 的特殊规定

(1)有效数字M

  有效数字M的范围始终是1<M<2,相当于1.xxxxxxx,其中,xxxxxx表示小数部分,在实际存储过程中,往往会省略有效数字最前面的 1 ,只保存小数部分,等到需要取出浮点型数据的时候,再把1加到最前面,这样做可以实现多存一位小数位,实现更高的精度。

(2)指数E

  在国际标准IEEE754中规定了E是一个无符号的整数(unsigned int)。

这就说明,如果E是8位,它能表示的数据范围为0~255,如果E为11位,它能表示的数据范围为0~2047。但是在实际的科学计数法中,指数是可能出现负数的,(比如0.5可以表示为(-1)^0 * 1.0 * 2^(-1))但是E为无符号整型,这就使得它无法储存负数。为了解决这一问题,IEEE754规定,设置一个中间量,存入内存时E的真实值必须加上这个中间量,保证存入E的值为正数,在取出E时再减去中间量,这样一来,指数为负数时的存储问题就得到了解决。

单精度中间量(8位):127

双精度中间量(11位):1023

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

2.1 E不全为0也不全为1

  在这种情况下,浮点数会采用以下规则取出并进行相应的转换:

  1. 将指数的值减去中间量,得到真实值
  2. 将有效数字M加上最前面的1

比如 :0.5 的二进制表示为0.1,按照国际标准IEEE754可以表示为 (-1)^0 * 1.0 * 2^(-1)

存储时的S为0,M为0(去掉了最前面的1并且向后补齐0),E为-1+127 = 126,以下是二进制的存储方式(单精度):

    0   01111110   00000000000000000000000
// 符号S    指数E          有效数字M

2.2 E全为0

  这种情况下,浮点数的指数E转换后的真实值为-127或-1023,说明这个数是一个很小的数,这时有效数字不再加上最前面的1,而是表示为0.xxxxxx的小数,用来近似±0的小数。

2.3 E全为1

  这种情况下,浮点数的指数E转换后的真实值为128或1024,说明这是一个很大的数,表示±无穷大。

三、引例解析

  了解了这些规则后,我们再回过头来看引例中的代码

#include<stdio.h>
int main()
{
	int a = 5;

	float* p = (float*)&a;
	printf("%f\n", *p);//打印指针p所指向的数据
	*p = 6.0;
	printf("%d\n", a);//以整型形式打印a变量
	return 0;
}

 我们先来看a变量,5的二进制表示为:

00000000000000000000000000000101

 但是在打印指针p所指向的数据a的时候是按浮点型打印,编译器会按照取浮点型的方式去理解这个二进制序列:

    0    00000000    00000000000000000000101
// 符号    指数              有效数字

显而易见,指数部分全为0,编译器会认为这是一个很小的数,打印结果为0.000000

当我们把6.0这个浮点型数据通过指针p赋值给a的内存时,会按存储浮点型数据的方式进行存储,二进制序列如下:

    0  10000001 10000000000000000000000
// 符号   指数          有效数字

按照这种方式存储之后,如果按整形数据进行打印的话,编译器在取出这个二进制序列时,并不会按照浮点型的方式取出,而是把它当作一串补码取出,打印出来自然就是很大的数了。

以上就是关于浮点型数据在内存中存储的全部内容啦~

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

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

相关文章

Employing Multi-Estimations for Weakly-Supervised Semantic Segmentation

eighted selective training (WST) 辅助信息 作者未提供代码

Vue+SpringBoot打造婚恋交友网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 会员管理模块2.3 新闻管理模块2.4 相亲大会管理模块2.5 留言管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 会员信息表3.2.2 新闻表3.2.3 相亲大会表3.2.4 留言表 四、系统展示五、核心代码5.…

解决分布式事务,Seata真香!

年IT寒冬&#xff0c;大厂都裁员或者准备裁员&#xff0c;作为开猿节流主要目标之一&#xff0c;我们更应该时刻保持竞争力。为了抱团取暖&#xff0c;林老师开通了《知识星球》&#xff0c;并邀请我阿里、快手、腾讯等的朋友加入&#xff0c;分享八股文、项目经验、管理经验等…

模型、算法、数据模型、模型结构是什么?它们之间有什么关联和区别?

模型、算法、数据模型、模型结构是什么&#xff1f;它们之间有什么关联和区别&#xff1f; 导读一、算法1、算法定义2、机器学习算法定义 二、模型1、模型定义2、数据模型定义3、机器学习模型定义 三、模型结构1、线性模型2、基于实例的模型3、决策树模型4、支持向量机5、集成方…

WebRTC:真正了解 RTP 和 RTCP

介绍 近年来&#xff0c;通过互联网进行实时通信变得越来越流行&#xff0c;而 WebRTC 已成为通过网络实现实时通信的领先技术之一。WebRTC 使用多种协议&#xff0c;包括实时传输协议 (RTP) 和实时控制协议 (RTCP)。 RTP负责通过网络传输音频和视频数据&#xff0c;而RTCP负责…

网络原理(2)——TCP协议

目录 一、TCP协议段格式 二、确认应答 三、超时重传 TCP全称为&#xff1a;"传输控制协议 Transmission Control Protocol)"。协议如其名&#xff0c;要对数据的传输进行一个详细的控制。 一、TCP协议段格式 源 / 目的端口号&#xff1a;表示数据从哪个进程来&am…

稀碎从零算法笔记Day20-LeetCode:回文链表

题型&#xff1a;链表、双指针 链接&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 234. 回文链表 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述&#xff08;红字为笔者添加&#xff09; 给你一个单链表的头节点 head &…

.rmallox勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 近年来&#xff0c;勒索病毒的威胁日益增加&#xff0c;其中一种名为.rmallox的勒索病毒备受关注。这种病毒通过加密文件并勒索赎金来威胁受害者。本文将介绍.rmallox勒索病毒的特点&#xff0c;以及如何恢复被其加密的数据文件&#xff0c;并提供预防措施&a…

三、传输层拥塞控制、差错控制

3.1 概述和传输层服务 传输服务和协议&#xff1a; 为运行在不同主机上的应用进程提供逻辑通信&#xff1b; 传输协议运行在端系统-发送方:将应用层的报文分成报文段&#xff0c;然后传递给网络层&#xff1b;接收方&#xff1a;将报文段重组成报文&#xff0c;然后传递给应用…

【C#图解教程】笔记

文章目录 1. C#和.NET框架.NET框架的组成.NET框架的特点CLRCLICLI的重要组成部分各种缩写 2. C#编程概括标识符命名规则&#xff1a; 多重标记和值格式化数字字符串对齐说明符格式字段标准数字格式说明符标准数字格式说明符 表 3. 类型、存储和变量数据成员和函数成员预定义类型…

【图论】计算图的n-hop邻居个数,并绘制频率分布直方图

计算图的n-hop邻居个数&#xff0c;并绘制频率分布直方图 在图论中&#xff0c;n-hop邻居&#xff08;或称为K-hop邻居&#xff09;是指从某个顶点出发&#xff0c;通过最短路径&#xff08;即最少的边数&#xff09;可以到达的所有顶点的集合&#xff0c;其中n&#xff08;或…

git如何回退版本reset和revert命令的区别

文章目录 git回退版本的方法使用reset回退使用revert回退 总结 git回退版本的方法 Git回退到某个版本有两种方法&#xff1a;reset和revert。 使用reset回退 git reset --hard <版本号>该命令将HEAD指针移动到指定的版本&#xff0c;并重置工作目录和暂存区的内容。这…

Vue-router3.0版本跳转报错

1.路由创建之后发现控制台push路由跳转报错了 2.解决方法&#xff1a; //在router文件中添加 const originalPush VueRouter.prototype.push VueRouter.prototype.push function push(location) {return originalPush.call(this, location).catch(err > err) }3.解决了

基于单片机的DDS函数信号发生器

单片机DDS函数信号发生器设计 该设计以AT89S52为主控芯片&#xff0c;通过控制高性能DDS&#xff08;直接数字频率合成&#xff09;芯片AD9834产生不同频率的信号&#xff0c;经过6阶巴特沃兹低通滤波电路&#xff0c;连接数字电位器的运算放大电路&#xff0c;输出信号。可以…

P2036 [COCI2008-2009 #2] PERKET

题目描述 Perket 是一种流行的美食。为了做好 Perket&#xff0c;厨师必须谨慎选择食材&#xff0c;以在保持传统风味的同时尽可能获得最全面的味道。你有 &#xfffd;n 种可支配的配料。对于每一种配料&#xff0c;我们知道它们各自的酸度 &#xfffd;s 和苦度 &#xfffd…

安装Pytorch——CPU版本

安装Pytorch——CPU版本 1. 打开pytorch官网2. 选择pip安装pytorch-cpu3.复制安装命令4. 在cmd命令窗口&#xff0c;进入你的虚拟环境4.1 创建虚拟环境4.2 进行安装 5. 安装成功6. 进行测试——如下面步骤&#xff0c;如图6.1 输入 python6.2 输入 import torch6.2 输入 print …

Spring Boot中application配置文件的生效顺序

Spring Boot的一个重要特性就是它的自动配置&#xff0c;这一特性在很大程度上依赖于名称为application的配置文件。本文将详细介绍在Spring Boot中&#xff0c;这些配置文件的加载顺序以及每份文件的应用范围。 文章目录 配置文件的种类配置文件的加载顺序配置文件的环境切换 …

kubernetes学习总结

kubernetes学习大纲 kubernetes的发展历程 Kubernetes的组件和架构 Kubernetes API对象基本组成 Kubernetes中的yml详解1 Kubernetes中的yml详解2 Deployment与Service

运用html相关知识编写导航栏和二级菜单

相关代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

手机网络连接性能API接口:查询手机网络连接性能状态

手机在网状态查询服务是一项非常方便的服务&#xff0c;可以帮助我们随时了解一个手机号码的在网状态。不论是查询自己的手机号码&#xff0c;还是查询他人的手机号码&#xff0c;这个服务都可以帮助我们获取准确的信息。今天&#xff0c;我想和大家介绍一个非常好用的手机在网…