浮点型在内存中的存储
前言
在上一期中我们讲到了有关于整型在内存中的存储,新朋友可以点开🔗了解一下,那这一期中我们将讲到的浮点数是不是存储方式和整型一致呢?
一、浮点数在内存中的存储
为了探究这个问题我们先来看一段代码
#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;
}
你们觉得运行结果会是什么样的呢?让我们来看一看。

二、浮点数存储规则
我们看到上面代码的输出结果是不是有点意料之外,其实这都和浮点型在内存中的存储规则有关系。
浮点数在计算机中的存储遵循IEEE 754标准,它定义了浮点数的表示和运算规则。根据您提供的图片内容,一个浮点数 VV 可以表示为:

在IEEE 754标准中,浮点数的存储通常分为单精度(32位)和双精度(64位)两种格式。单精度浮点数的存储结构如下:
- 1位符号位 SS
- 8位指数位 EE
- 23位有效数字位 MM

双精度浮点数的存储结构如下:
- 1位符号位 SS
- 11位指数位 EE
- 52位有效数字位 MM

指数位 EE 使用偏移量表示,单精度浮点数的偏移量是127,双精度浮点数的偏移量是1023。这意味着实际存储的指数值需要加上这个偏移量才能得到实际的指数值。
有效数字位 MM 通常使用隐式偏移表示,即在有效数字的最高位之前隐含了一个1(对于非规格化数)或0(对于规格化数)。这意味着在存储时,最高位的1是不存储的,从而可以存储更多的有效数字。
举个例子
假设我们有一个十进制数 3.5,我们想要将其转换为32位单精度浮点数格式。
-
确定符号位:由于3.5是一个正数,符号位 SS 为0。
-
将数值转换为二进制形式:3.5的二进制形式是11.1(无限循环小数,但在有效数字位内,我们只取前几位,例如11.1000...)。
-
规范化数值:将数值规范化,使其形式变为1.xxxxxx * 2^n。对于3.5,我们可以将其表示为1.1 * 2^1。
-
计算指数位 EE:规范化后的数值的指数是1,加上偏移量127(因为这是单精度浮点数),得到 E=1+127=128E=1+127=128。128的二进制形式是10000000。
-
计算有效数字位 MM:去掉规范化数值的整数部分1,剩下的小数部分是1.1000...。我们只取前23位(因为单精度浮点数有23位有效数字位),得到0.1100000...。将这个小数转换为二进制,我们得到1100000...(这里省略了23位之后的位)。
-
组合符号位、指数位和有效数字位:将这三部分组合起来,我们得到32位的二进制数:
- 符号位 SS:0
- 指数位 EE:10000000
- 有效数字位 MM:1100000...
最终,3.5的32位单精度浮点数表示为: 0 10000000 1100000000000000000000
三、浮点数的存储过程
对于有效数字M和指数E有一些特别的规定
当1<=M<2,M可以写成1.xxxxxx的形式,xxxxx表示小数部分。计算机内存保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。
E为一个无符号整型:意味着它的取值范围为0~255;但是科学计数法中的E是可能出现负数的,所以存入内存时E的真实值必须再加上一个中间值, 对于8位的E,中间值是127,11位的E,中间值是1023.
3.1浮点数取出过程
3.1.1E不全为0或不全为1
-
读取符号位 SS:这是最左边的一位,决定数值的正负。
-
读取指数位 EE:接下来的几位是指数位,它们表示数值的量级。
-
读取有效数字位 MM:剩余的位是有效数字位,表示数值的精度。
-
计算实际指数:将存储的指数值减去偏移量,得到实际的指数。对于32位单精度浮点数,偏移量是127;对于64位双精度浮点数,偏移量是1023。
-
计算有效数字:将有效数字位 MM 转换为二进制小数,并在前面加上一个隐含的1(对于规格化的数),得到 1.M1.M 的形式。
-
计算数值:将 1.M1.M 乘以 22 的 E−偏移量E−偏移量 次幂,得到最终的十进制数值。
举个例子,假设我们有一个32位单精度浮点数表示为:
1 01111011 00100000000000000000000
-
符号位:最左边的位是1,表示这是一个负数。
-
指数位:接下来的8位是01111011,转换为十进制是123。
-
有效数字位:剩余的23位是00100000000000000000000,转换为二进制小数是0.100000...(这里省略了23位之后的位)。
-
计算实际指数:123 - 127 = -4。
-
计算有效数字:1.100000...(前面隐含的1加上读取到的二进制小数)。
-
计算数值:1.100000...×2−41.100000...×2−4。
将 1.100000...1.100000... 转换为十进制小数,我们得到1.0,然后乘以 2−42−4(即除以16),得到最终的十进制数值0.0625。因此,这个32位单精度浮点数表示的是-0.0625。
3.1.2E全为0
浮点数指数E等于1-127(1-1023)即真实值,有效数字M不再加上第一位的1,而是还是为0.xxxxx的小时。这样是为了表示+-0,以及接近0很小的数字。

3.1.3E全为1
这时,有效数字M全为0,则表示无穷打(正负取决于符号位s)
四、题目解析
为了观看方便我们再把开头的代码和运行结果贴在这里。
#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以整型存储再内存中得到的二进制序列。
0000 0000 0000 0000 0000 0000 0000 1001
我们将9的二进制按浮点数的形式拆分:
- 得到符号位S=0
- 后面8为指数E=00000000
- 最后23为有效数字M=000 0000 0000 0000 0000 1001.
按照E全为0的规则浮点数V应该等于:
V是一个很小的接近0的正数,用十进制表示就是0.000000/
再看看浮点数9.0用整数打印为什么是1091567616?
- 浮点数 9.0=二进制的1001.0
- 换成科学计数法是1.001*2^3
- 符号位S=0
- 有效数字M=001(后面加20个0)
- 指数E=3+127=130=10000010
所以写成二进制形式应该是S+E+M:
0 10000010 001 0000 0000 0000 0000 0000
整数在内存是补码转换成原码就是1091567616。
本期内容到此结束啦,如果对您有帮助的话点亮小星星吧。
相关文章:
浮点型在内存中的存储
前言 在上一期中我们讲到了有关于整型在内存中的存储,新朋友可以点开🔗了解一下,那这一期中我们将讲到的浮点数是不是存储方式和整型一致呢? 一、浮点数在内存中的存储 为了探究这个问题我们先来看一段代码 #include<stdio…...
微信小程序之behaviors
目录 概括 Demo演示 进阶演示 1. 若具有同名的属性或方法 2. 若有同名的数据 3. 若有同名的生命周期函数 应用场景 最后 属性&方法 组件中使用 代码示例: 同名字段的覆盖和组合规则 概括 一句话总结: behaviors是用于组件间代码共享的特性, 类似一…...
java.lang.NoClassDefFoundError: ch/qos/logback/core/util/StatusPrinter2
1、问题 SpringBoot升级报错: Exception in thread "main" java.lang.NoClassDefFoundError: ch/qos/logback/core/util/StatusPrinter2 类找不到: Caused by: java.lang.ClassNotFoundException: ch.qos.logback.core.util.StatusPrinter22、…...
WebRTC ICE配置类型
ICE(Interactive Connectivity Establishment)是一个用于建立WebRTC和其他实时通信会话中的点对点连接的框架。ICE协议通过尝试多个候选地址(候选者)来寻找最佳路径来连接两个对等端。ICE有多种配置类型,包括标准ICE、…...
制造知识普及(八)--企业内部物料编码(IPN)与制造商物料编码(MPN)
1、什么是物料编码 通常情况下,物料编码分两种,一种是企业内部物料编码(IPN),由于在企业研发制造和生产中确认物料唯一性的,用于承载设计参数要求和技术要求。另一种是制造商物料编码(MPN&…...
大模型学习笔记 - InstructGPT中的微调与对齐
LLM 微调 之 InstructGPT中的微调与对齐 LLM 微调 之 InstructGPT中的微调与对齐 技术概览 InstructGPT中的微调与对齐 大体步骤标注数据量模型训练 1. SFT 是如何训练的2. Reward Model是如何训练的3. RLHF 是如何训练的具体讲解RLHF 的loss 函数 模型效果参考链接…...
Unity近似的Transform实现
Unity近似的Transform实现 #include <stdint.h> #include<iomanip> #include <sstream>#include "Transform.h"//Transform::Transform(const Transform& a){ // LOGW("xww 2"); //}Transform::Transform(glm::vec3 localPositio…...
openvidu私有化部署
openvidu私有化部署 简介 OpenVidu 是一个允许您实施实时应用程序的平台。您可以从头开始构建全新的 OpenVidu 应用程序,但将 OpenVidu 集成到您现有的应用程序中也非常容易。 OpenVidu 基于 WebRTC 技术,允许开发您可以想象的任何类型的用例…...
基于深度学习的视频伪造检测
基于深度学习的视频伪造检测旨在利用深度学习技术来检测和识别伪造的视频内容。伪造视频,尤其是深伪(Deepfake)视频,近年来随着生成对抗网络(GAN)技术的发展,变得越来越逼真和难以识别。这对个人…...
python机器人编程——开发一个pymatlab工具箱(上)
目录 一、前言二、实现过程2.1 封装属性2.2 数据流化显示2.3 输入数据的适应性 三、核心代码说明3.1 设置缓存3.2 随机信号3.3 根据设置绘图 五、总结四、源码PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源 一、前言 我们知道m…...
输入类控件
目录 1.Line Edit 代码示例: 录入个人信息 代码示例: 使用正则表达式验证输入框的数据 代码示例: 验证两次输入的密码一致 代码示例: 切换显示密码 2.Text Edit 代码示例: 获取多行输入框的内容 代码示例: 验证输入框的各种信号 3.Combo Box 代码示例: 使用下拉框模拟…...
C++20中的模块
大多数C项目使用多个翻译单元(translation units),因此它们需要在这些单元之间共享声明和定义(share declarations and definitions)。headers的使用在这方面非常突出。模块(module)是一种language feature,用于在翻译单元之间共享声明和定义。它们是某些…...
Selenium与流行框架集成:pytest与Allure报告
Selenium与流行框架集成:pytest与Allure报告 在现代软件开发中,自动化测试是确保产品质量和快速迭代的关键。Selenium作为业界领先的Web自动化测试工具,其灵活性和强大的功能受到广泛认可。为了进一步提升测试效率和报告质量,本文…...
日撸Java三百行(day17:链队列)
目录 一、队列基础知识 1.队列的概念 2.队列的实现 二、代码实现 1.链队列创建 2.链队列遍历 3.入队 4.出队 5.数据测试 6.完整的程序代码 总结 一、队列基础知识 1.队列的概念 今天我们继续学习另一个常见的数据结构——队列。和栈一样,队列也是一种操…...
Android摄像头采集选Camera1还是Camera2?
Camera1还是Camera2? 好多开发者纠结,Android平台采集摄像头,到底是用Camera1还是Camera2?实际上,Camera1和Camera2分别对应相机API1和相机API2。Android 5.0开始,已经弃用了Camera API1,新平台…...
零基础5分钟上手亚马逊云科技AWS核心云开发/云架构 - 创建高可用数据库集群
简介: 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,让大家零基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我将每天介绍一个基于亚马逊云科…...
力扣315.计算右侧小于当前元素的个数
力扣315.计算右侧小于当前元素的个数 离散化 树状数组 const int N 100010;int tr[N],n;class Solution {public:vector<int> countSmaller(vector<int>& nums) {n nums.size();vector<int> tmp(nums);vector<int> res(n);memset(tr,0,sizeo…...
websocket,css动画和css-position、display、区别
一、websocket codereturn {// 用于存储 WebSocket 返回的状态数据statusList: [],},mounted() {this.setupWebSocket();this.startBlinking();},methods: {setupWebSocket() {// 创建 WebSocket 连接const socket = new WebSocket(ws://xxx.xxx:xxx/xxx);// WebSocket 连接成功…...
前端获取视频文件宽高信息和视频时长
安装 yarn add video-metadata-thumbnails | npm install video-metadata-thumbnails引入依赖包 import { getMetadata } from video-metadata-thumbnails使用 if (file.name.includes(mp4)) {if (file) {try {console.log(file)// 获取视频的元数据const metadata await …...
【区块链+医疗健康】基于区块链的药品类监管应用管理系统 | FISCO BCOS应用案例
退热类药品的购药信息及政企互动信息等各项数据的安全性、保密性、真实性,不仅影响着监管部门的科学监管、 有效监管,也影响着企业的经营安全、诚信口碑,是区域药品安全监管工作进展的直观体现。 江苏数予科技有限公司构建基于区块链的药品类…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
