数据在内存中的存储【下篇】

news2025/7/5 19:00:26

文章目录

  • ⚙️3.浮点型在内存中的存储
    • 🔩3.1.一个例子
    • 🔩3.2.浮点数的存储规则
    • 🔩3.3.例题解析

在这里插入图片描述

⚙️3.浮点型在内存中的存储

🔩3.1.一个例子

🔴浮点数存储的例子:👇

int main()
{
	int n = 9;
	float* pFloat = (float*)&n;

	printf("n的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);

	*pFloat = 9.0;
	printf("num的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);

	return 0;
}

🥰可以先猜想一下打印的4个值分别是多少?

在这里插入图片描述
📀整型和浮点型在内存的存储是有区别的

🔩3.2.浮点数的存储规则

💡根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:

🔴 (-1)^S * M * 2^E
🔴 (-1)^S 表示符号位,当S=0,V为正数;当S=1,V为负数
🔴 M 表示有效数字,大于等于1,小于2
🔴 2^E 表示指数位

💡我们举个栗子:
假如一个10进制浮点数为5.5,我们应该怎么转换成上面的形式呢?
在这里插入图片描述
二进制的数据的每一位权重是这样分布的☝️
在这里插入图片描述
根据规则,转换完之后就是这样的☝️

IEEE 754规定:
对于32位的浮点数(float),最高的一位是符号位S,接着的8位是指数E,剩下的23位为有效数字M
在这里插入图片描述
对于64位的浮点数(double),最高的一位是符号位S,接着的11位是指数E,剩下的52位为有效数字M
在这里插入图片描述

🔴IEEE 754对有效数字M和指数E,还有一些特别规定:

前面说过,1<=M<2,也就是说,M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表示小数部分
IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的 xxxxxx部分,比如保存 1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去,这样做的目的,是节省1位有效数字,以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字

🔴至于指数E,情况就比较复杂:

首先E为一个无符号整数unsigned int)这意味着,如果E为8位,它的取值范围为0 ~ 255;如果E为11位,它的取值范围为0 ~ 2047。但是,我们知道,科学计数法中的E是可以出现负数的(比如0.5 = 1.0 * 2^-1),所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2 ^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001
💡举个栗子:5.5

int main()
{
	float f = 5.5f;
	// 101.1
	// (-1)^0 * 1.011 * 2^2
	// 0 10000001 011 00000000000000000000
	// S E(2+127)  M    补20个0(补齐23位)
	// 40b00000 --- 16进制

	return 0;
}

可以调试看一下内存👇
在这里插入图片描述
🥰根据规则,由此就可以知道了浮点数是如何存储的了

🔴指数E从内存中取出还可以再分成三种情况:

🔔E不全为0或不全为1

这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位1
比如:
0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1),其阶码为 -1+127=126,表示为 01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为:

0 01111110 00000000000000000000000

🔔E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值
有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字

🔔E全为1

这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位S)

🔩3.3.例题解析

int main()
{
	int n = 9;
	//00000000000000000000000000001001 -- 9的补码
	//0 00000000 00000000000000000001001
	//E = 1-127 = -126
	//M = 0.00000000000000000001001
	//(-1)^0 * 0.00000000000000000001001 * 2^-126
	float* pFloat = (float*)&n;

	printf("n的值为:%d\n", n);//9
	printf("*pFloat的值为:%f\n", *pFloat);//0.0

	*pFloat = 9.0;//以浮点数的视角,存放浮点型的数字
	//1001.0
	//1.001 * 2^3
	//(-1)^0 * 1.001 * 2^3
	//S = 0
	//E = 3
	//M = 1.001
	//0 (3+127)10000010 00100000000000000000000 -- 补码=原码
	printf("num的值为:%d\n", n);//1091567616
	printf("*pFloat的值为:%f\n", *pFloat);//9.0

	return 0;
}

☝️double类型原理也是如此☝️
🥰希望大家可以理解🥰

总结🥰
以上就是 数据在内存中的存储下篇 内容啦🥳🥳🥳🥳
本文章所在【C语言知识篇】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
希望我们可以做一个用心的人💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用Python unittest搭建自动化测试框架

unittest是xUnit系列框架中的一员&#xff0c;如果你了解xUnit的其他成员&#xff0c;那你用unittest来应该是很轻松的&#xff0c;它们的工作方式都差不多。 unittest核心工作原理 unittest中最核心的四个概念是&#xff1a;test case, test suite, test runner, test fixtu…

华为OD机试 - 人数最多的站点(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

【mybatis】

对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称ORM&#xff09;模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 ORM框架是连接数据库的桥梁&#xff0c;只要提供了持久化类与表的映射关系&#xff0c;ORM框架在运行时就能参照映射文…

【Yolov5】深度模型进行训练-CPU版

yolo5模型训练1.yolov5自己的模型训练1.1 git下载对应的源码到服务器1.2 从最新的 YOLOv5版本自动下载模型。1.3 detect.py 推断1.4 train.py进行训练1.5 yolo的原理2.训练自己的模型2.1 Data下面新建如图目录Mydata2.1 lableimg进行数据标注的图形2.2 数据集2.3 train.py调整d…

IP 协议

1.IP协议报头如下图:版本号 代表的是当前的IP协议的版本,此处的版本一共有两个取值:v4和v6.本文着重针对v4版本进行解析.首部长度 代表的是整个IP报头的长度,这个报头长度是可变长的,可变长的原因在于报头中的选项,这个属性是一个可有可无的属性,会改变报头长度,它的单位是32bi…

5个原因告诉您为什么要拥有个人IP

在数字时代中&#xff0c;信息每分每秒都在飞速地增长&#xff0c;对于企业和个人来说&#xff0c;获得关注变得越来越具有挑战性。如果您希望在网上创造某种形式的存在感&#xff0c;保持内容的原创性和新鲜度是您通往成功的路上不可避免的挑战。尽管如此&#xff0c;从竞争对…

电商项目之Feign与Dubbo技术选型

文章目录1 问题背景2 前言3 思路4 Feign与Dubbo的区别5 总结6 真实案例1 问题背景 电商项目&#xff0c;B端以consul作为注册中心。重构了一个营销服务&#xff0c;以Nacos作为注册中心。B端需要调用营销服务。关于远程调用框架&#xff0c;营销服务用了Dubbo&#xff0c;而B端…

吉卜力风格水彩画怎么画?

著名的水彩艺术家陈坚曾说&#xff1a;“水彩是用水润调和形成的饱和度极高的艺术画面&#xff0c;在纸上晕染的画面面积、强度等具有许多随意性&#xff0c;天空的颜色乌云密布&#xff0c;都是很随意的&#xff0c;难以模仿。” 是的&#xff0c;水彩画的妙处就在于不确定的…

C语言数据结构初阶(1)----时空复杂度

目录 1. 数据结构&#xff0c;算法的概念 2. 算法的效率 2.1 算法复杂度 3. 时间复杂度 3.1 时间复杂度的概念 3.2 大O的渐进表示法 3.3 小试牛刀 4. 算法的空间复杂度 4.1 小试牛刀 1. 数据结构&#xff0c;算法的概念 数据结构(Data Structure)是计算机存储、组织数据…

2023从0开始学性能(3) —— 探索性能测试流程2

性能测试计划 性能测试的计划中应该由项目描述、项目的业务模型和性能指标&#xff08;指标来源于调研需求中预期指标&#xff09;&#xff0c;性能测试环境说明&#xff08;前期调研的配置信息&#xff09;以及测试的场景设计&#xff0c;具体的我们后面再慢慢说。 性能测试场…

4123版驱动最新支持《霍格沃茨之遗》,英特尔锐炫显卡带你畅游魔法世界

2023年开年最火的3A大作&#xff0c;那一定是近期上架steam平台的《霍格沃茨之遗》&#xff0c;这款游戏在2020年9月份曝光&#xff0c;游戏根据《哈利波特》系列书籍内容改编&#xff0c;作为一款开放式的3A大作&#xff0c;《霍格沃兹之遗》目前在steam上的实时在线人数已经突…

客户体验:客户对企业产生的所有交互与感知!

“客户体验是一种纯主观的在用户使用产品过程中建立起来的感受。良好的用户体验有助于公司不断完善产品或服务。正是这所有用户接触的感受差异&#xff0c;构成了用户对一家公司独特的体验认知。”说白了&#xff0c;客户体验就是客户和公司接触产生的感受。客户体验主要关注客…

JS的事件循环

文章目录写在前面1.浏览器的进程模型1.1 何为进程1.2 何为线程1.3 浏览器有哪些线程和进程2.渲染主线程是如何工作的任务队列的优先级面试题如何理解JS异步JS中的计时器能做到精确计时吗&#xff1f;为什么&#xff1f;写在前面 此处的文字为自己的理解 1.浏览器的进程模型 1.…

git的安装及git的使用方法和指令

Git的使用什么是版本控制&#xff1f;什么是 Git&#xff1f;人工版本控制器版本控制工具常见版本控制工具怎么工作的&#xff1f;git 文件生命周期状态区域安装配置-- global检查配置创建仓库 - repository工作流与基本操作查看工作区的文件状态如果显示乱码的解决方式git sta…

JUC并发编程(下)

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 学习地址 写在最前 JUC并发编程&#xff08;上&#xff09; JUC&#xff08;Java Util Concurrent&#xff09;学习内容框架&…

Leetcode第530题二叉搜索树的最小绝对差|C语言

刚开始看到这道题&#xff0c;习惯性的找了搜索树的最左下和最右下的结点进行计算。结果发现要求返回的是“任意两个结点”的差的绝对值中最小的值。 思路&#xff1a;看了答案&#xff0c;因为二叉搜索树的中序遍历是有序数组&#xff0c;因此可以采用中序遍历对相邻结点之间进…

合约检测之slither(草稿)

一、Slither 介绍及运行流程 Slither 是一个静态分析框架&#xff0c;它通过将 Solidity 智能合约转换为称为 SlithIR 的中间表示来工作。 SlithIR 使用静态单一赋值 (SSA) 形式和精简指令集来减慢分析执行速度&#xff0c;同时保留在 Solidity 转换为字节码时可用的语义信息。…

GEE学习笔记 六十一:颜值就是战斗力

引用网络名人局座的一句话&#xff1a;“颜值越高的武器&#xff0c;战斗力越强”。对于我们做开发也是&#xff0c;使用的工具颜值越高&#xff0c;我们越喜欢使用。Google Earth Engine在线编辑器&#xff08;https://code.earthengine.google.com/&#xff09;虽然目前还不是…

【Proteus仿真】【STM32单片机】环境监测系统设计

文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD1602显示模块、蜂鸣器、按键模块、DHT11温湿度传感器、继电器加热祛湿加湿模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示…

实现达梦数据库 disql 工具在 Linux 系统里上下翻动查看和编辑历史命令

本文内容已在如下环境上测试&#xff1a; 操作系统&#xff1a;银河麒麟10 数据库版本&#xff1a;达梦8 一、默认情况下&#xff0c;在 Linux 系统中使用 disql 命令时&#xff0c;若使用键盘的上下键查找历史命令复用&#xff0c;会出现乱码&#xff0c;导致在 Linux 上编写…