【C语言】浮点型数据在内存中的存储
🚀🚀🚀 如果文章对你有帮助不要忘记点赞关注收藏哦🚀🚀🚀
文章目录
- ⭐浮点数在内存中的存储
- 1.1 🤓举个例子:
- 1.2浮点数存储规则🌈:
- 对于M与E有一些特别规定
- 1.3解释前面题目:
- 完结
⭐浮点数在内存中的存储
float、double、long double
浮点数的范围定义在float.h头文件中
1.1 🤓举个例子:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int main()
{int num = 5;float* pfloat = (float*)#printf("num的值为:%d\n", num);printf("*pFloat的值为:%f\n", *pfloat);*pfloat = 9.0;printf("num的值为:%d\n", num);printf("*pFloat的值为:%f\n", *pfloat);return 0;
}
输出结果
这里肯定会有小伙伴好奇,int于float都是四个字节,为什么只是改变&num的指针类型,用%d的方式取出来值没有变化,用%f读取出来 * pfloat的值也就是num的数值会是0??而用浮点数给 * pfloat重新赋值用%d打印又不对,用%f打印出来又正常。
我们都知道改变了指针类型,里面的二进制数据是不会变的,只不过读取大小和读取方式有区别,而int于float又都是四个字节,那就证明,浮点型的存取方式与整形不相同。
1.2浮点数存储规则🌈:
如果说浮点数与整数在内存中的存取方式不相同,那么浮点数的存储规则是什么呢 ?
实际上浮点数是以科学计数法的方式存储在内存中
- (-1)^ S * M * 2^E (// 此处的^均代表指数,而不是异或)
- S代表符号位,由于内存中存储的是二进制所以S只有0和1,0代表正数(-1的0次幂为1),1代表负数(-1的1次幂为-1)
- M代表有效数字 大于1小于2
- E代表 2的指数位
🌞IEEE 754标准规定,32位浮点数最高的1位是符号位s,接下来8位是指数E,剩下的23位为M.
64位浮点数最高的1位是符号位s,接下来11位是指数E,剩下的52位为M。
对于M与E有一些特别规定
标准规定,对于M,由于一定是1.XXXXX,所以可以舍去第一位,取出的时候加上即可,所以存在M中的数据就是1.后面的数字,这样做可以节省一位数字,虽然M只有23位,但是节省一位之后就可以存储相当于24位的数字了。
对于E,E是一个无符号整数,拿单精度浮点型float举例,E为8位,所以它的取值范围为0-255,但是科学计数法中E是可以出现负数的,,所以IEEE754标准规定,存入内存时E必须加上一个中间数,对于八位的E,这个中间数是127,对于11位的E这个中间数是1023,比如单精度E为10,那么在存储的时候,将E加上127,保存在内存中就是10001001。
以上为E的存储情况,E取出的时候还分为三种情况:
E不为全0或者不为全1
这时浮点数采用下面的规则,指数E减去127(或者1023),得到真实E的值,再将M的前面加回第一位的1.
E为全0
这时,浮点数的指数E=1-127(或者1-1023)就是真实值
有效数字M不再加上前面的第一位1,这样做是为了表示±0,就是一个接近于0的一个很小的数字
E为全1
相当于±无穷大(对于float本身来说)
ps:
实际上浮点数是以科学计数法的方式存储在内存中,S、E、M是科学计数法的不同部分
比如存储一个float类型110.75,计算机中存储的是二进制,转化为二进制数据1101110.11用科学计数法就表示为1.10111011*2^6
其中 符号就代表了S,S=0,1.10111011代表了M,6代表了E,八位二进制为00000110,将E加上127,将m去掉第一位1,所以这个数据存储在内存中应该就是0100 0010 1101 1101 1000 0000 0000 0000,转化为16进制为42DD 8000
让我们验证一下:
完全正确✨,至于数据为什么是倒着存,这就涉及到大小端字节序问题,请参考这篇博文http://t.csdn.cn/mHrtN
1.3解释前面题目:
int main()
{int num = 5;float* pfloat = (float*)#printf("num的值为:%d\n", num); //5printf("*pFloat的值为:%f\n", *pfloat); //0.000000*pfloat = 9.0;printf("num的值为:%d\n", num); //1091567616printf("*pFloat的值为:%f\n", *pfloat); //9.000000return 0;
}
- 为什么num 为5,&num转换为浮点型指针就变成了0.000000? 🧐
5的二进制 00000000 00000000 00000000 00000101
转换为浮点型指针进行读取,采用浮点型的规定去读,此时在浮点型看来
(-1)^ S * M * 2 ^ E = (-1)^ 1 * 0.000000000000000000000101 * 2 ^ (1-127) ( 因为E全为0,参考上面E全为0取出。)得到一个超级小的数字,对于float来说就根无穷小没有区别,截断等于0.000000。
- 为什么对*pfloat赋值9.0,用%d输出是1091567616?🤓
将9.0的二进制是1001 科学技术法 1.001*2^3 S=0,E=3,M=1001
用float的方式存储就是 0 10000010 00100000000000000000000
用%d的方式输出,也就是用整数方式把数据读取出来,结果就是1091567616
最后的pfloat = 9.0用%f输出,用浮点型方式存,用浮点型方式取,自然就是9.000000了。
完结
创作不易,还请各位小伙伴多多点赞👍关注✨收藏⭐
相关文章:

【C语言】浮点型数据在内存中的存储
🚀🚀🚀 如果文章对你有帮助不要忘记点赞关注收藏哦🚀🚀🚀 文章目录⭐浮点数在内存中的存储1.1 🤓举个例子:1.2浮点数存储规则🌈:对于M与E有一些特别规定1.3解释前面题目&…...
impala中的刷新元数据和刷新表
impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据。 虽然Hive系统也提供了SQL语义,但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满…...

Vscode创建vue项目的详细步骤
目录 一、概述 操作的前提 二、操作步骤 一、概述 后端人员想在IDEA里面创建一个Vue的项目,但是这非常麻烦,用vscode这个前端专用软件创建就会非常快速。 操作的前提 1.安装vscode软件的步骤:vscode下载和安装教程和配置中文插件&#…...

如何在面试中介绍自己的项目,才能让软件测试面试官无可挑剔,
四、项目 4.1 简单介绍下最近做过的项目 根据自己的项目整理完成,要点: 1)项目背景、业务、需求、核心业务的流程 2)项目架构,B/S还是C/5,数据库用的什么? 中间件用的什么?后台什么语言开发…...

虹科方案|从 uCPE 到成熟的边缘计算平台
基于开放硬件平台,通用客户端设备 (uCPE) 支持快速添加、集成或删除任意数量的集中管理虚拟功能。 为了增加收入并保持竞争优势,托管服务提供商 (MSP) 和企业正在部署 uCPE 以增强业务敏捷性、加速新服务的引入并提高运营效率。最初,uCPE被部…...

计算机是怎么读懂C语言的?
文章目录前言程序环境翻译环境翻译环境分类编译预处理预处理符号预定义符号#define#undef命令行定义条件编译文件包含头文件包含查找规则嵌套文件包含其他预处理指令编译阶段汇编链接🎉welcome🎉 ✒️博主介绍:博主大一智能制造在读ÿ…...

hadoop入门介绍及各组件功能运行关系
文章目录Hadoop 组成部分1.HDFS2.MapReduce 架构概述3. yarn 架构概述4.HDFS、YARN、MapReduce三者关系Hadoop 组成部分 1.HDFS Hadoop Distributed File System,简称 HDFS,是一个分布式文件系统。 HDFS 架构概述 主要分为 NameNode (mn):存储文件的元…...

(HP)新手引导使用react-shepherd
1,官方参数文档:https://shepherdjs.dev/docs/tutorial-02-usage.html 2,基本代码 import { ShepherdTour } from react-shepherd; import ./index.less; // 自己的样式文件,用来修改样式 import ./shepherd.less; // 将shephe…...

数据结构:栈和队列(Leetcode20. 有效的括号+225. 用队列实现栈+232. 用栈实现队列)
目录 一.数据结构--栈 1.栈的基本介绍 2.栈的实现 二.数据结构--队列 1.队列的基本介绍 2.队列的实现 三.栈的运用(Leetcode20. 有效的括号225) 1.问题描述 2.问题分析 题解代码: 四.用两个队列实现栈(225. 用队列实现栈 - 力扣(Leetcode&a…...
22.2.19周赛双周赛(贪心、记忆化搜索...)
文章目录双周赛98[6359. 替换一个数字后的最大差值](https://leetcode.cn/problems/maximum-difference-by-remapping-a-digit/)[6361. 修改两个元素的最小分数](https://leetcode.cn/problems/minimum-score-by-changing-two-elements/)贪心排序[6360. 最小无法得到的或值](ht…...

2023最新软件测试面试题(带答案)
1. 请自我介绍一下(需简单清楚的表述自已的基本情况,在这过程中要展现出自信,对工作有激情,上进,好学) 面试官您好,我叫###,今年26岁,来自江西九江,就读专业是电子商务,毕…...

【C++】类型转换方法
本篇博客让我们来见识一下C中新增的类型转换方法 文章目录1.C语言中类型转换2.C中的强制类型转换2.1 static_cast2.2 reinterpret_cast2.3 const_castvolatile关键字2.4 dynamic_cast3.C强制类型转换的作用4.RTTI1.C语言中类型转换 在C语言中,类型转换有下面两种形…...

100亿级订单怎么调度,来一个大厂的极品方案
背景 超时处理,是一个很有技术难度的问题。 所以很多的小伙伴,在写简历的时候,喜欢把这个技术难题写在简历里边, 体现自己高超的技术水平。 在40岁老架构师 尼恩的读者交流群(50)中,尼恩经常指导大家 优化简历。 最…...

C++性能白皮书
最近看完了《C性能白皮书》,这本书列出了一些性能优化的思路,不过只是一些指引,没有讲具体细节,我整理出了其中的关键点分享给大家: 硬件篇 作为一个程序员,想要性能优化,最好要了解些硬件&…...
华为OD机试 - 黑板上色 | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 …...

如何在六秒内吸引观众的注意力
根据《2022国民专注力洞察报告》显示,当代人的连续专注时长,已经从2000年的12秒,下降到了现在的8秒。对于这个事实你可能难以相信,实际上这意味着,大多数互联网用户跳到一些页面上时,可能眼皮都不眨一下就离…...

FreeRTOS与UCOSIII任务状态对比
FreeRTOS任务状态 1、运行态 正在运行的任务,正在使用处理器的任务。 单核处理器中任何时候都有且只有一个任务处于运行态。 2、就绪态 已经准备就绪(非阻塞或挂起),可以立即运行但还没有运行的任务。 正在等待比自己高优先级…...

小程序 npm sill idealTree buildDeps 安装一直没反应
目录 一、问题 二、解决 1、删除.npmsrc 、清除缓存 2、更换镜像源 3、最终检测 一、问题 记录:今天npm 一直安装不成功 显示:sill idealTree buildDeps 我的版本: 我百度到换镜像源安装方法,但我尝试后,依然…...

GPT系列详解:初代GPT
本文详细解读了OpenAI公司在2018年6月发布的论文《Improving Language Understanding by Generative Pre-Training》,它其中介绍的算法也就是后来人们说的GPT。本文借鉴了李沐的这个视频,感兴趣的同学可以移步观看大神的讲解。 目录引言GPT方法无监督预训…...
为什么要使用数据库
数据保存在内存优点:存取速度快缺点:数据不能永久保存数据保存在文件优点:数据永久保存缺点:1)速度比内存操作慢,频繁的IO操作。2)查询数据不方便数据保存在数据库1)数据永久保存2&a…...
数据湖 (特点+与数据仓库和数据沼泽的对比讲解)
数据湖就像一个“数据水库”,把企业所有原始数据(结构化的表格、半结构化的日志、非结构化的图片/视频)原样存储,供后续按需分析。 对比传统数据仓库: 数据仓库数据湖数据清洗后的结构化数据(如Excel表格&…...
《算力觉醒!ONNX Runtime + DirectML如何点燃Windows ARM设备的AI引擎》
ONNX Runtime是一个跨平台的高性能推理引擎,它就像是一位精通多种语言的翻译官,能够无缝运行来自不同深度学习框架转化为ONNX格式的模型。这种兼容性打破了框架之间的隔阂,让开发者可以将更多的精力投入到模型的优化和应用中。 从内部机制来…...
PyTorch 中mm和bmm函数的使用详解
torch.mm 是 PyTorch 中用于 二维矩阵乘法(matrix-matrix multiplication) 的函数,等价于数学中的 A B 矩阵乘积。 一、函数定义 torch.mm(input, mat2) → Tensor执行的是两个 2D Tensor(矩阵)的标准矩阵乘法。 in…...

Linux-pcie ranges介绍
参考链接:https://elinux.org/Device_Tree_Usage#PCI_Host_Bridge pcie bar高低端BAR起始地址介绍 pcie设备树节点 / {compatible "rockchip,rk3588";interrupt-parent <&gic>;#address-cells <2>;#size-cells <2>;pcie3x4: p…...

使用Vditor将Markdown文档渲染成网页(Vite+JS+Vditor)
1. 引言 编写Markdown文档现在可以说是程序员的必备技能了,因为Markdown很好地实现了内容与排版分离,可以让程序员更专注于内容的创作。现在很多技术文档,博客发布甚至AI文字输出的内容都是以Markdown格式的形式输出的。那么,Mar…...

第4讲、Odoo 18 模块系统源码全解与架构深度剖析【modules】
引言 Odoo 是一款强大的开源企业资源规划(ERP)与客户关系管理(CRM)系统,其核心竞争力之一在于高度模块化的架构设计。模块系统不仅是 Odoo 框架的基石,更是实现功能灵活扩展与定制的关键。本文将结合 Odoo…...
【加密算法】
计算机网络加密算法详解 在计算机网络中,加密算法是保障数据安全的核心技术,用于防止数据在传输过程中被窃听、篡改或伪造。本文将详细介绍常见的加密算法分类、工作原理及其在网络中的应用。 1. 加密算法分类 加密算法主要分为以下三类: 类型特点典型算法对称加密加密和解…...

Reactor模式详解:高并发场景下的事件驱动架构
文章目录 前言一、Reactor模式核心思想二、工作流程详解2.1 服务初始化阶段2.2 主事件循环2.3 子Reactor注册流程2.4 IO事件处理时序2.5 关键设计要点 三、关键实现技术四、实际应用案例总结 前言 在现代高性能服务器开发中,如何高效处理成千上万的并发连接是一个关…...

OpenHarmony平台驱动使用(二),CLOCK
OpenHarmony平台驱动使用(二) CLOCK 概述 功能简介 CLOCK,时钟是系统各个部件运行的基础,以CPU时钟举例,CPU 时钟是指 CPU 内部的时钟发生器,它以频率的形式工作,用来同步和控制 CPU 内部的各…...
【OSS】 前端如何直接上传到OSS 上返回https链接,如果做到OSS图片资源加密访问
使用阿里云OSS(对象存储服务)进行前端直接上传并返回HTTPS链接,同时实现图片资源的加密访问,可以通过以下步骤实现: 前端直接上传到OSS并返回HTTPS链接 设置OSS Bucket: 确保你的OSS Bucket已创建…...