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

✨✨欢迎大家来到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
// 符号   指数          有效数字

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nodejs 第五十六章(爬虫)

什么是爬虫&#xff1f; 爬虫&#xff0c;也称为网络爬虫或网络蜘蛛&#xff0c;是指一种自动化程序或脚本&#xff0c;用于在互联网上浏览和提取信息。爬虫模拟人类用户在网页上的行为&#xff0c;通过HTTP协议发送请求&#xff0c;获取网页内容&#xff0c;然后解析并提取感…

Day18 Java学生管理系统

Day18 Java学生管理系统 一、需求分析 考虑的方面&#xff1a; 用户需求、功能需求、非功能性需求、约束条件、优先级和权衡、可追踪性、需求验证。 二、项目搭建 搭建学生管理系统 1、创建项目的main ;pojo ; sms ; utils包。 2、编写系统的 增&#xff08;涉及到扩容–…

一. 并行处理与GPU体系架构-GPU并行处理

目录 前言0. 简述1. 这个小节会涉及到的关键字2. CPU与GPU在并行处理的优化方向3. Summary总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第一章——并行处理与GPU体…

4.1_5 文件存储空间管理

文章目录 4.1_5 文件存储空间管理&#xff08;一&#xff09;存储空间的划分与初始化&#xff08;二&#xff09;存储空间管理——空闲表法&#xff08;三&#xff09;存储空间管理——空闲链表法&#xff08;1&#xff09;空闲盘块链&#xff08;2&#xff09;空闲盘区链 &…

腾讯云企业用户可以申请免费服务器试用吗?

腾讯云企业用户可以申请免费服务器试用吗&#xff1f;可以的&#xff0c;腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核…

拌合楼内部管理系统开发(三) 继续功能模块及数据表设计-收发管理模块(无人值守功能)

前言:继续闭门造车 继续发挥,上一篇写到了生产管理,今天开始做无人值守的功能模块的设计了.核心就是收发管理的模块了. 一、发货的工作流程&#xff1a; 我设想的发货流程如下&#xff1a; 1. 发货的源头指令来源于生产计划&#xff1a; 生产计划要素是需要生产的产品&#xff…

解决google Chorme 隐私设置错误

问题&#xff1a; 我们在使用浏览器的时候&#xff0c;出现隐私设置错误“您的链接不是私密连接”&#xff0c;如下图所示&#xff1a; 第一步开始来解决隐私设置错误&#xff0c;打开浏览器之后&#xff0c;点击右上方的三点图标&#xff0c;选择设置&#xff0c;如下图所示&…

基于支持向量机SVM的沉降预测,SVM详细原理,Libsvm详解

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 完整代码和数据下载链接:基于支持向量机SVM的沉降预测资源-CSDN文库 https://download.csdn.net/download/abc991835105/88947544 SVM应用实例,基于支持向量机SVM的沉降预测…

MYSQL报 - Lock wait timeout exceeded; try restarting transaction

前言 今天在使用数据库编辑数据时&#xff0c;页面突然卡主&#xff0c;退出程序后重新编辑&#xff0c;发现报错&#xff0c;1205 - Lock wait timeout exceeded&#xff1b; try restarting transaction&#xff08;如下图&#xff09;&#xff0c;正巧在和同事开会&#xf…

基于Springboot和Redis实现的在线选课系统

1.项目简介 1.1 介绍 毕业设计真的就是demo吗&#xff1f;作为工作前的最后一个校园项目&#xff0c;毕业设计应当尽可能的贴近企业实战&#xff0c;业务不必很复杂&#xff0c;但要做到麻雀虽小五脏俱全。本期学长跟大家一起分享如何开发一个在线选课系统&#xff0c;需求也…

如何实现队列和栈的转化(c语言)

文章目录 一.什么是栈二.什么是队列三.怎么把栈变成队列&#xff08;力扣&#xff09;四.怎么把队列变成栈&#xff08;力扣&#xff09;总结 一.什么是栈 栈&#xff08;stack&#xff09;又名堆栈&#xff0c;它是一种运算受限的线性表。限定权在表尾进行插入和删除操作的线性…

从政府工作报告中的IT热词统计探计算机行业发展(二)人工智能+:3次

政府工作报告作为政府工作的全面总结和未来规划&#xff0c;不仅反映了国家整体的发展态势&#xff0c;也为各行各业提供了发展的指引和参考。随着信息技术的快速发展&#xff0c;计算机行业已经成为推动经济社会发展的重要引擎之一。因此&#xff0c;从政府工作报告中探寻计算…

嵌入式学习39-程序创建数据库及查找

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开 数据库文件(创建一个数据库连接) 参数: filename: …

顺序表操作

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;既然选择了远方&#xff0c;当不负青春…

腾讯云免费服务器配置大全和个人企业申请流程,2024年新版教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

力扣爆刷第98天之hot100五连刷76-80

力扣爆刷第98天之hot100五连刷76-80 文章目录 力扣爆刷第98天之hot100五连刷76-80一、295. 数据流的中位数二、121. 买卖股票的最佳时机三、55. 跳跃游戏四、45. 跳跃游戏 II五、763. 划分字母区间 一、295. 数据流的中位数 题目链接&#xff1a;https://leetcode.cn/problems…

最后的挣扎 - Qt For Android on HuaWei Mate 60Pro (v4.0.0)

简介 为什么叫最后的挣扎, 其实都知道即将到来的 HarmonyOS NEXT 将抛弃Android支持&#xff0c;纯血HarmonyOS 将上线&#xff0c; 此时再说Qt for android支持Huawei HarmonyOS的设备其实并没有多少意思&#xff0c; 但恐怕在大多数基础软件完成兼容前&#xff0c; 很多人还是…

avue-crud顶部操作按钮插槽;avue-crud列数据插槽;avue-crud行操作按钮插槽

1.avue-crud顶部操作按钮插槽&#xff1b; <template slot"menuLeft" slot-scope"{ size }"><div class"left"><div class"btn"><el-button type"primary" size"small" click"onBatchR…

[Python初阶]2255.统计是给定字符串前缀的字符串数目

目录 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 ③.startswith()方法理解 与 说明 Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决 ⑤总结 2255.统计是给定字符串前缀的字符串数目 ①.题目 ②.问题分析 需求:统计列表words中,是字符串s的前缀的字符串的数目. 解…

无人机自动返航算法实现与优化

一、引言 随着无人机技术的快速发展&#xff0c;其在航拍、农业、救援等领域的应用越来越广泛。在这些应用中&#xff0c;无人机的自动返航功能显得尤为重要。一旦无人机失去控制或与遥控器失去连接&#xff0c;自动返航算法能够确保无人机安全返回起飞点&#xff0c;避免损失和…