当前位置: 首页 > news >正文

浮点型在内存中的存储

前言

在上一期中我们讲到了有关于整型在内存中的存储,新朋友可以点开🔗了解一下,那这一期中我们将讲到的浮点数是不是存储方式和整型一致呢?

一、浮点数在内存中的存储

为了探究这个问题我们先来看一段代码

#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位单精度浮点数格式。

  1. 确定符号位:由于3.5是一个正数,符号位 SS 为0。

  2. 将数值转换为二进制形式:3.5的二进制形式是11.1(无限循环小数,但在有效数字位内,我们只取前几位,例如11.1000...)。

  3. 规范化数值:将数值规范化,使其形式变为1.xxxxxx * 2^n。对于3.5,我们可以将其表示为1.1 * 2^1。

  4. 计算指数位 EE:规范化后的数值的指数是1,加上偏移量127(因为这是单精度浮点数),得到 E=1+127=128E=1+127=128。128的二进制形式是10000000。

  5. 计算有效数字位 MM:去掉规范化数值的整数部分1,剩下的小数部分是1.1000...。我们只取前23位(因为单精度浮点数有23位有效数字位),得到0.1100000...。将这个小数转换为二进制,我们得到1100000...(这里省略了23位之后的位)。

  6. 组合符号位、指数位和有效数字位:将这三部分组合起来,我们得到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

  1. 读取符号位 SS:这是最左边的一位,决定数值的正负。

  2. 读取指数位 EE:接下来的几位是指数位,它们表示数值的量级。

  3. 读取有效数字位 MM:剩余的位是有效数字位,表示数值的精度。

  4. 计算实际指数:将存储的指数值减去偏移量,得到实际的指数。对于32位单精度浮点数,偏移量是127;对于64位双精度浮点数,偏移量是1023。

  5. 计算有效数字:将有效数字位 MM 转换为二进制小数,并在前面加上一个隐含的1(对于规格化的数),得到 1.M1.M 的形式。

  6. 计算数值:将 1.M1.M 乘以 22 的 E−偏移量E−偏移量 次幂,得到最终的十进制数值。

举个例子,假设我们有一个32位单精度浮点数表示为:

1 01111011 00100000000000000000000

  1. 符号位:最左边的位是1,表示这是一个负数。

  2. 指数位:接下来的8位是01111011,转换为十进制是123。

  3. 有效数字位:剩余的23位是00100000000000000000000,转换为二进制小数是0.100000...(这里省略了23位之后的位)。

  4. 计算实际指数:123 - 127 = -4。

  5. 计算有效数字:1.100000...(前面隐含的1加上读取到的二进制小数)。

  6. 计算数值: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的二进制按浮点数的形式拆分:

  1. 得到符号位S=0
  2. 后面8为指数E=00000000
  3. 最后23为有效数字M=000 0000 0000 0000 0000 1001.

按照E全为0的规则浮点数V应该等于:

V是一个很小的接近0的正数,用十进制表示就是0.000000/

再看看浮点数9.0用整数打印为什么是1091567616?

  1. 浮点数 9.0=二进制的1001.0
  2. 换成科学计数法是1.001*2^3
  3. 符号位S=0
  4. 有效数字M=001(后面加20个0)
  5. 指数E=3+127=130=10000010

所以写成二进制形式应该是S+E+M:

0 10000010 001 0000 0000 0000 0000 0000

整数在内存是补码转换成原码就是1091567616。

本期内容到此结束啦,如果对您有帮助的话点亮小星星吧。 

相关文章:

浮点型在内存中的存储

前言 在上一期中我们讲到了有关于整型在内存中的存储&#xff0c;新朋友可以点开&#x1f517;了解一下&#xff0c;那这一期中我们将讲到的浮点数是不是存储方式和整型一致呢&#xff1f; 一、浮点数在内存中的存储 为了探究这个问题我们先来看一段代码 #include<stdio…...

微信小程序之behaviors

目录 概括 Demo演示 进阶演示 1. 若具有同名的属性或方法 2. 若有同名的数据 3. 若有同名的生命周期函数 应用场景 最后 属性&方法 组件中使用 代码示例&#xff1a; 同名字段的覆盖和组合规则 概括 一句话总结: behaviors是用于组件间代码共享的特性, 类似一…...

java.lang.NoClassDefFoundError: ch/qos/logback/core/util/StatusPrinter2

1、问题 SpringBoot升级报错&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: ch/qos/logback/core/util/StatusPrinter2 类找不到&#xff1a; Caused by: java.lang.ClassNotFoundException: ch.qos.logback.core.util.StatusPrinter22、…...

WebRTC ICE配置类型

ICE&#xff08;Interactive Connectivity Establishment&#xff09;是一个用于建立WebRTC和其他实时通信会话中的点对点连接的框架。ICE协议通过尝试多个候选地址&#xff08;候选者&#xff09;来寻找最佳路径来连接两个对等端。ICE有多种配置类型&#xff0c;包括标准ICE、…...

制造知识普及(八)--企业内部物料编码(IPN)与制造商物料编码(MPN)

1、什么是物料编码 通常情况下&#xff0c;物料编码分两种&#xff0c;一种是企业内部物料编码&#xff08;IPN&#xff09;&#xff0c;由于在企业研发制造和生产中确认物料唯一性的&#xff0c;用于承载设计参数要求和技术要求。另一种是制造商物料编码&#xff08;MPN&…...

大模型学习笔记 - InstructGPT中的微调与对齐

LLM 微调 之 InstructGPT中的微调与对齐 LLM 微调 之 InstructGPT中的微调与对齐 技术概览 InstructGPT中的微调与对齐 大体步骤标注数据量模型训练 1. SFT 是如何训练的2. Reward Model是如何训练的3. RLHF 是如何训练的具体讲解RLHF 的loss 函数 模型效果参考链接&#xf…...

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 应用程序&#xff0c;但将 OpenVidu 集成到您现有的应用程序中也非常容易。 OpenVidu 基于 WebRTC 技术&#xff0c;允许开发您可以想象的任何类型的用例&#xf…...

基于深度学习的视频伪造检测

基于深度学习的视频伪造检测旨在利用深度学习技术来检测和识别伪造的视频内容。伪造视频&#xff0c;尤其是深伪&#xff08;Deepfake&#xff09;视频&#xff0c;近年来随着生成对抗网络&#xff08;GAN&#xff09;技术的发展&#xff0c;变得越来越逼真和难以识别。这对个人…...

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)&#xff0c;因此它们需要在这些单元之间共享声明和定义(share declarations and definitions)。headers的使用在这方面非常突出。模块(module)是一种language feature&#xff0c;用于在翻译单元之间共享声明和定义。它们是某些…...

Selenium与流行框架集成:pytest与Allure报告

Selenium与流行框架集成&#xff1a;pytest与Allure报告 在现代软件开发中&#xff0c;自动化测试是确保产品质量和快速迭代的关键。Selenium作为业界领先的Web自动化测试工具&#xff0c;其灵活性和强大的功能受到广泛认可。为了进一步提升测试效率和报告质量&#xff0c;本文…...

日撸Java三百行(day17:链队列)

目录 一、队列基础知识 1.队列的概念 2.队列的实现 二、代码实现 1.链队列创建 2.链队列遍历 3.入队 4.出队 5.数据测试 6.完整的程序代码 总结 一、队列基础知识 1.队列的概念 今天我们继续学习另一个常见的数据结构——队列。和栈一样&#xff0c;队列也是一种操…...

Android摄像头采集选Camera1还是Camera2?

Camera1还是Camera2&#xff1f; 好多开发者纠结&#xff0c;Android平台采集摄像头&#xff0c;到底是用Camera1还是Camera2&#xff1f;实际上&#xff0c;Camera1和Camera2分别对应相机API1和相机API2。Android 5.0开始&#xff0c;已经弃用了Camera API1&#xff0c;新平台…...

零基础5分钟上手亚马逊云科技AWS核心云开发/云架构 - 创建高可用数据库集群

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;让大家零基础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应用案例

退热类药品的购药信息及政企互动信息等各项数据的安全性、保密性、真实性&#xff0c;不仅影响着监管部门的科学监管、 有效监管&#xff0c;也影响着企业的经营安全、诚信口碑&#xff0c;是区域药品安全监管工作进展的直观体现。 江苏数予科技有限公司构建基于区块链的药品类…...

3分钟快速上手:使用res-downloader实现全网资源一键捕获与下载

3分钟快速上手&#xff1a;使用res-downloader实现全网资源一键捕获与下载 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 想…...

如何用clawPDF高效解决日常办公中的5大文档处理难题?

如何用clawPDF高效解决日常办公中的5大文档处理难题&#xff1f; 【免费下载链接】clawPDF Open Source Virtual (Network) Printer for Windows that allows you to create PDFs, OCR text, and print images, with advanced features usually available only in enterprise s…...

5分钟搞定B站缓存视频:m4s转MP4完整解决方案

5分钟搞定B站缓存视频&#xff1a;m4s转MP4完整解决方案 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否遇到过B站缓存视频无法在其他设备…...

从销售报表分析到供应链数据优化,SpreadJS 透视表插件全场景应用指南

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

电子信息专业毕业生就业深度分析报告

数据来源&#xff1a;麦可思《2025年中国本科生就业报告》、西安电子科技大学/电子科技大学/华中科技大学/同济大学/北京邮电大学/上海科技大学2025届就业质量报告、职友集、新东方在线、凤凰网、皮书网等公开平台 更新时间&#xff1a;2026年4月一、行业总览&#xff1a;电子信…...

WebSocket安全连接指南:从HTTP到HTTPS/WSS的平滑迁移(含Nginx配置模板)

WebSocket安全连接指南&#xff1a;从HTTP到HTTPS/WSS的平滑迁移&#xff08;含Nginx配置模板&#xff09; 当你的网站从HTTP升级到HTTPS后&#xff0c;原本运行良好的WebSocket连接突然失效&#xff0c;控制台里一片红色错误提示——这可能是许多开发者遇到的典型场景。本文将…...

打造专属海拉鲁冒险:塞尔达传说旷野之息个性化存档编辑指南

打造专属海拉鲁冒险&#xff1a;塞尔达传说旷野之息个性化存档编辑指南 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 在塞尔达传说旷野之息的广阔世界中&#xf…...

快速上手:GLM-4-9B-Chat-1M超长上下文模型部署与调用教程

快速上手&#xff1a;GLM-4-9B-Chat-1M超长上下文模型部署与调用教程 1. 认识GLM-4-9B-Chat-1M模型 1.1 什么是GLM-4-9B-Chat-1M GLM-4-9B-Chat-1M是智谱AI推出的最新一代开源对话模型&#xff0c;特别针对超长上下文场景进行了优化。这个模型的核心特点是支持高达1,000,000…...

Phi-3 Forest Lab应用场景:数据工程师——SQL转Pandas+异常检测逻辑生成

Phi-3 Forest Lab应用场景&#xff1a;数据工程师——SQL转Pandas异常检测逻辑生成 1. 数据工程师的日常痛点 数据工程师每天都要处理大量数据转换和分析任务&#xff0c;其中两个最常见的工作是&#xff1a; SQL到Pandas的转换&#xff1a;需要将业务团队提供的SQL查询转换…...

OpenClaw+千问3.5-9B低成本方案:自建模型替代OpenAI API

OpenClaw千问3.5-9B低成本方案&#xff1a;自建模型替代OpenAI API 1. 为什么选择自建模型替代OpenAI API 去年冬天的一个深夜&#xff0c;我正在调试一个基于OpenClaw的自动化工作流。当看到账单上OpenAI API调用费用突破四位数时&#xff0c;我意识到必须寻找替代方案。这就…...