C语言浮点型在内存中的存储
目录
前言:
引言:
浮点数存储规则
举个栗子:
TIP:
单精度浮点数存储的模型(float)
双精度浮点数存储的模型(double)
IEEE对 M 的特殊规定
IEEE对 E 的特殊规定
小试牛刀
先看第一段代码
再看第二段代码
前言:
我们首先需要知道什么是浮点型,以下是两种常见的浮点型。
3.14159 ------------- 这是最常见的浮点型,也就是小数。
1E10 ------------- 这个也表示浮点型,E表示底数10,而E后面的数表示指数,所以E10就是10^10,而E前面的1是数量级,综上,1E10就是1*10^10。
引言:
我们先看一段代码
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;
}
输出结果:

我们不难发现,当n以整型的方式存进去,然后分别以整型和浮点型的方式取出,发现以浮点型的方式打印结果有问题;对应的,当n以浮点型的方式存进去,再以整型的方式取出,结果也是跟我们想象的不一样。
由此,可以得出一个结论,浮点型在内存中的存储和整型在内存中的存储是不一样的。
浮点数存储规则
根据国际标准IEEE,任意一个二进制浮点数V可以表示成下面的形式:
- (-1)^ S * M * 2 ^ E
- (-1) ^ S表示符号位,当S=0,V是正数,当S=1,V是负数。
- M表示有效数字,大于等于1,小于2
- 2^E表示指数位。
举个栗子:
十进制表示的5.5
首先5的二进制位就是101,而小数部分0.5我们就用1来表示,最终结果就是101.1
为何小数部分用1表示就可以呢?
因为整数部分个位数的权重是2^0,十位数的权重是2^1,百位数的权重是2^2,以此类推,小数部分的第一位表示2^(-1),也就是0.5,小数部分的第二位就是2^(-2)……
因此我们用IEEE表示就是
(-1)^ 0 * 1.011 * 2 ^ 2
所以S=0,M=1.011,E=2
TIP:
理论上任何一个浮点型都可以用IEEE表达形式表示,但如果浮点数过于复杂,就不能精准的表示出来。
比如3.14,小数部分想要表示出0.14,需要我们一直凑,但大概率是凑不出来,会有一些误差!
单精度浮点数存储的模型(float)
对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位比特位是有效数字M

双精度浮点数存储的模型(double)
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M

IEEE对 M 的特殊规定
前面说过,1<=M<2,所以,M可以写成1.xxxxxxxx的形式,其中xxxxxxxxx表示小数部分。
IEEE规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxxx小数部分。
比如保存1.01时,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的是,节省1位有效数字,是的表达小数部分更精确。
IEEE对 E 的特殊规定
首先,E作为一个无符号整数(unsigned int)
这意味着,如果E为8位,它的取值范围是0~255,如果是11位,他的取值范围是0~2047。
但是,我们知道,科学技术法中是可以出现负数的。
所以IEEE规定,存入内存时E的真实值必须加上一个中间数,对于8位的E来说,这个中间数的值就是127,对于11位的E来说,这个中间值就是1023。
我们取出来时,还是需要减去中间数的。
上面讲的内容是讲E如何存储到内存中的,下面开始讲解如何把E取出来。
- E不为全0或不全为1
这是最普遍的情况,我们将指数E的值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1

- E全为0
表示原有的真实值是-127,2^-127是一个非常小的数字,无限接近于0,所以有效数字M不再加上第一位的1,而是还原0.xxxxxxxx的小数,使得接近于0。
- E全为1
表示是2^128次方,是一个非常大的数字,所以表示正负无穷大(正负取决于符号位S)。
小试牛刀
我们现在已经大致掌握了浮点型在内存如何存储和取出,让我们来解决一下引言的问题吧!
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在整型n中的存储形式是
00000000000000000000000000001001
然后我们照搬,将其存储在浮点型
0 00000000 00000000000000000001001
S E M
可以看出E是全0,根据IEEE规定,当E为全0时,我们对于M不需要补数字1,而现在的M也是一个非常小的数字,当我们用%f打印时,只能保留6位有效数字,因此打印结果就是0.000000
再看第二段代码
我们首先是将9.0存储再一个浮点型中
9.0在浮点型中存储的二进制位表达形式是
1001.0
1.001*2^3 (注意一定要表示成科学技术法的形式!再找S、M、E)
S=0 M=1.001(存储在内存就是001) E=3(3+127)
0 10000010 0010000000000000000000
注意M = 001存储直接放在最前面
而将这一部分照搬到整型,发现结果就是一个非常大的数字!1091567616
相关文章:
C语言浮点型在内存中的存储
目录 前言: 引言: 浮点数存储规则 举个栗子: TIP: 单精度浮点数存储的模型(float) 双精度浮点数存储的模型(double) IEEE对 M 的特殊规定 IEEE对 E 的特殊规定 小试牛刀 先…...
elementPlus | el-tabs 标签管理路由页面
<script setup> import { useRouter } from vue-router const router useRouter()const tabClick (tab)>{const idx tab.indexif(idx 0){router.push(/)}... } </script> <template><!-- 撑开 stretch"true" --><el-tabs type&quo…...
如何使用ffmpeg制作透明背景的视频
最近我们尝试在网页上叠加数字人讲解的功能,发现如果直接在网页上放一个矩形的数字人视频,效果会很差,首先是会遮挡很多画面的内容,其次就是不管使用任何任务背景,画面都和后面的网页不是很协调,如图所示&a…...
C#中对于using的使用方式
导入命名空间 使用list需要导入 System.Collections.Generic;这个命名空间 using System.Collections.Generic; using UnityEngine;public class UsingTest : MonoBehaviour {void Start(){List<int> intlist new List<int>();} }省略类名 using UnityEngine; …...
【Java】HashMap集合
Map集合概述和使用 Map集合概述 Interface Map<k,v> k:键值类型 v:值的类型 Map集合的特点 键值对 映射关系 Key 和 Value一个键(Key)对应一个值(Value)键不允许重复,值可以重复如…...
百度网盘使用指南
文章目录 备份篇手机文件备份电脑文件备份 查找篇移动端PC端 文件操作文件解压文件扫描PDF工具图片工具音频操作 备份篇 手机文件备份 在百度网盘APP种点击 我的–设置–自动备份设置 里边有相册备份, 文档备份, 微信文件备份, 手机通讯录, 短信, 通话备份等功能 电脑文件备…...
CSS 滚动驱动动画与 @keyframes 新语法
CSS 滚动驱动动画与 keyframes 在 CSS 滚动驱动动画相关的属性出来之后, keyframes 也迎来变化. 以前, keyframes 的值可以是 from, to, 或者百分数. 现在它多了一种属性的值 <timeline-range-name> <percentage> 建议先了解 animation-range 不然你会对 timeli…...
二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道
在软件开发中,我们经常需要创建和复制对象。然而,有时候直接创建对象可能会导致性能下降或代码重复。为了解决这些问题,原型模式应运而生。而使用原型管理器(Prototype Manager)来集中管理原型对象可以进一步提高灵活性…...
【微信小程序开发】学习小程序的网络请求和数据处理
前言 网络请求是微信小程序中获取数据和与服务器交互的重要方式。微信小程序提供了自己的API来处理网络请求,使得开发者可以轻松地在微信小程序中实现数据的获取和提交。本文将介绍微信小程序中的网络请求,包括使用wx.request发起GET和POST请求…...
微信小程序 slot 不显示
问题:创建组件,使用带名字的slot,页面调用组件使用slot不显示 源码: 组件xml <view class"p-item br24" style"{{style}}"><slot name"right" wx:if"{{!custBottom}}"></slot>&l…...
Spring Boot 优雅配置yml配置文件定义集合、数组和Map
一、value 获取配置文件 在平时的yml配置文件中,我们经常使用到配置基本数据类型的字符串,比如配置日志文件的写法如下: # 配置日志输出级别 logging:# 指定logback配置文件的位置 config: classpath:logback-spring.xml# 文件日志要输出的路…...
java+springboot+vue开发的大学生健康检测小程序
主要功能测试身体健康指数,添加病历,添加日历清单等,管理员导出学生健康电子档案表等。前端小城程序,后端管理员vue开发,接口Java springboot开发。 小程序演示视频 https://www.bilibili.com/video/BV1Kc411d7bb/?s…...
从零开始的LINUX(四)
1.yum: 功能:软件包管理器,功能类似与手机上的应用商店。通过yum可以获取指令的下载地址,然后一键式安装指令。由于yum中的地址一般都是外网的,所以需要镜像源(即国内的下载地址)。 相关指令&…...
组播应用层收不到问题-接收网卡绑定
问题背景: 平台:Android 设备A:组播发送者,发送组播数据 设备B:组播接受者,接收组播数据 设备A与设备B通过有线连接,连接在设备B的eth0网卡上 问题: 设备B在没有通讯模块网卡的情况…...
回流重绘零负担,网页加载快如闪电
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、回…...
QT5.15在Ubuntu22.04上编译流程
在我们日常遇到的很多第三方软件中,有部分软件针对开发人员,并不提供预编译成果物,而是需要开发人员自行编译,此类问题有时候不是问题(编译步骤的doc详细且清晰时),但有时候又很棘手(…...
【电路笔记】-交流波形和交流电路理论
交流波形和交流电路理论 文章目录 交流波形和交流电路理论1、概述2、交流发电2.1 涡轮发电2.2 变压器 3、交流功率3.1 RMS值3.2 功率分配 4、总结 当谈论电流或电压时,这些信号可以分为两大类:直流和交流。 DC 状态为“直流电”,该定义重新组…...
vue2 系列:自定义 v-model
1. input 中的 v-model <!-- 表单双向绑定 --> <input :value"username" input"username $event.target.value" /> <!-- 等于 --> <input v-model"username" /> 2. 自定义组件 v-model <!-- 组件双向绑定 -->…...
广东木模板批发,建筑桥梁工程专用组合木模板
作为广东地区的木模板批发商,我们致力于为建筑行业提供高品质的木模板产品。在众多产品中,我们特别推荐我们的建筑桥梁工程专用组合木模板,为桥梁工程提供卓越的支持和出色的性能。 我们的组合木模板是专为桥梁工程设计的,以满足对…...
工业相机常见的工作模式、触发方式
参考:机器视觉——工业相机的触发应用(1) - 知乎 工业相机常见的工作模式一般分为: 触发模式连续模式同步模式授时同步模式 触发模式:相机收到外部的触发命令后,开始按照约定时长进行曝光,曝光结束后输出一帧图像。…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
