C进阶:数据在内存中的存储(2)

news2024/11/22 6:35:57

六一儿童节快乐哇各位过期的小朋友们

引入:

在上一篇博文中,相信大家对于数据类型以及整数在内存中的存储有了一定了解,那么,浮点数是怎么在内存中存储的呢?下面来看一下我的讲解。

浮点数家族:

包括:float,double,long double类型。与limits.h相似,浮点数也有限制范围的头文件float.h.

与limits.h相似,float.h也包括浮点数类型的最大最小值,下面来看一下float.h的大致内容。

 下面来看一个浮点数存储的例子:

#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("num的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	return 0;
}

大家可以先猜一下,代码中的这四个值是多少,

下面,让我们看一下输出的结果:

相信结果也让大家一脸懵逼,但是为什么会出现这样的结果呢?

主要还是因为浮点数和整形在内存中的存放有差异 像是整型数据放入,整形数据拿出或者浮点型数据放入,浮点数类型拿出这样的都是正确的做法,不会导致数据的异常。而像是浮点型数据放入,整形数据拿出或者整形数据放入,浮点型数据拿出这样是错误的做法,会导致数据的异常。

浮点数类型的存储和整型到底有什么差异呢?下面我们来看看浮点数在计算机内部的表示方法。

详细解读:

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

1.(-1)^S*2^E

2.(-1)^S表示符号位,当S=0,V是正数;当S=1,V为负数。

3.M表示有效数字,大于1,小于2。

4.2^E表示指数位。

让我们来举个小栗子:

相信大家已经了解了一个浮点数的具体表示方法,下面我们来看一下具体在内存中是怎么存储的。

IEEE 754规定:对于32位的浮点数,最高的一位是符号位S,接着八位是指数E,剩下的是23位有效数字S。 

对于64位的浮点数,最高的一位是符号位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加上去,这样做的目的,是节省一位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1省略以后,等于可以保存24位有效数字。

至于指数E,情况就有一些复杂。

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

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

E不全为0或者不全为1

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

0  01111110 00000000000000000000000

E全为0

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

E全为1

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

好了,关于浮点数的标识规则,就说到这里。

解释前面的题目:

下面,让我们回到一开始的问题:为什么0x00000009还原成浮点数,就变成了0.000000?

利用以上的知识,我们可以将9换为以下的二进制:

9 -> 0 00000000 00000000000000000001001

符号位S=0,E=00000000,最后23位数字0000000000000000001001.

我们将它再转换为浮点数即0.000000000000000000001001*2^(-126)=1.001*2^(-146).

显然:V是一个很小的数,无限接近于0,所以用十进制表示就是0.

那么为什么9.0又会转换为一个很大的数呢?

我们再将9.0转换为二进制表示:

9.0->1001.0->1.001*2^3->0 100000010 00100000000000000000000

然后将这个二进制转换为整型即为1091567616.

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

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

相关文章

Python四则运算“计算器”——整数口算练习“小程序”

设定练习题目数量、最大取值整数数&#xff0c;即时判定&#xff0c;答对鼓励答错打印正确结果。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简…

python 1B 之路径

1. 绝对路径&#xff1a; os.path.abspath("") 翻译过来就是通过操作系统找到路径-绝对路径&#xff0c;os是operation system&#xff0c; abspath 是absolute path 比如现在运行的文件在service文件夹中&#xff0c;运行后&#xff1a; 2. 上层目录&#xff1a; 方…

快来,一起复习一下JDK动态代理和CGLib动态代理的区别

背景 工作也有四年了&#xff0c;基础的东西许久不看有些遗忘。一起来复习一下吧 JDK动态代理和CGLib的区别 JDK动态代理主要是针对类实现了某个接口&#xff0c;AOP则会使用JDK动态代理。它基于反射的机制实现&#xff0c;生成一个实现同样接口的一个代理类&#xff0c;然后…

MongoDB 学习

文章目录 前言1、MongoDB 的优势是什么2、部署2.1、Windows 系统中的安装启动2.2、Shell连接&#xff08;mongo命令&#xff09;2.3、Compass-图形化界面客户端2.4、Linux系统中的安装启动和连接 3、基本常用命令3.1、选择和创建数据库3.2、数据库删除3.3、集合操作3.3.1、集合…

HEVC预测编码介绍

介绍 ● 一幅图像内邻近像素之间有着较强的空间相关性&#xff0c;相邻图像之间也有很强的时间相关性&#xff1b; ● 预测编码&#xff08;Prediction Coding&#xff09;是指利用已编码的一个或几个样本值&#xff0c;根据某种模型或者方法&#xff0c;对当前的样本值进行预…

LeetCode572. 另一棵树的子树

题目 leetcode572. 另一棵树的子树 思路 递归解决。 ①递归的大问题化小----判断c是否为a子树可以转换为判断c是否为a左子树的子树或者c是否为a右子树的子树。 ②递归的结束条件-----如果两颗树相同&#xff0c;返回true&#xff1b;两棵树为空&#xff0c;返回true&#xff…

【十三】设计模式~~~行为型模式~~~中介者模式(Java)

中介者模式-Mediator Pattern【学习难度&#xff1a;★★★☆☆&#xff0c;使用频率&#xff1a;★★☆☆☆】 2.1. 模式动机 在用户与用户直接聊天的设计方案中&#xff0c;用户对象之间存在很强的关联性&#xff0c;将导致系统出现如下问题&#xff1a;系统结构复杂&#…

动态规划-硬币排成线

动态规划-硬币排成线 1 描述2 样例2.1 样例 1:2.2 样例 2:2.3 样例 3: 3 算法解题思路及实现3.1 算法解题分析3.1.1 确定状态3.1.2 转移方程3.1.3 初始条件和边界情况3.1.4 计算顺序 3.2 算法实现3.2.1 动态规划常规实现3.2.2 动态规划滚动数组 该题是lintcode的第394题&#x…

第二十一章 开发Productions - ObjectScript Productions - 延迟发送

文章目录 第二十一章 开发Productions - ObjectScript Productions - 延迟发送延迟发送 生成事件日志条目在 ObjectScript 中生成事件日志条目 第二十一章 开发Productions - ObjectScript Productions - 延迟发送 延迟发送 除了同步&#xff08;等待&#xff09;和异步&…

9秒被骗245万元?AI火了,骗子也来了!

生成式AI技术&#xff0c;如GPT-4等强大的语言模型的广泛普及&#xff0c;已经逐步开展应用。这种对未来技术的期待之余&#xff0c;不得不面对AI技术可能被滥用的风险&#xff0c;甚至已经有一些犯罪分子已开始巧妙地利用AI技术进行电信诈骗。 当下最积极学习的除了学生&#…

【高危】Apache bRPC <1.5.0 存在任意代码执行漏洞

漏洞描述 Apache bRPC 是C开发、由百度RPC发展而来的工业级 RPC 框架。 该项目受影响版本存在任意代码执行漏洞&#xff0c;由于server.cpp对于用户输入的pid_file使用wordexp展开。 具备bRPC控制权限的攻击者可在bRPC启动时通过控制pid_file参数注入恶意内容&#xff08;如…

DNS隧道流量分析

1.域名准备 选择哪家的云都没问题&#xff0c;国内云需要实名&#xff0c;不建议使用&#xff0c;这里我选择的TX云&#xff0c;因为之前注册过了&#xff0c;自己拿来做个流量分析不成问题 域名添加解析记录 需要准备自己的vps作为DNS隧道的服务端&#xff0c;且需要添加ns…

.nc文件根据经纬度提取点上数值python

.nc文件根据经纬度提取点上数值python 1、数据集2、代码部分3、完整代码 1、数据集 VOD Climate Archive &#xff08;VODCA&#xff09; 数据由维也纳工业大学提供&#xff08;https://doi.org/ 10.5281/zenodo.2575599&#xff09;。VODCA是一种空间分辨率为0.25的全球每日V…

【十一】设计模式~~~结构型模式~~~代理模式(Java)

【学习难度&#xff1a;★★★☆☆&#xff0c;使用频率&#xff1a;★★★★☆】 6.1. 模式动机 在某些情况下&#xff0c;一个客户不想或者不能直接引用一个对 象&#xff0c;此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起…

网络流量管理系统

网络监控对于当今的组织至关重要&#xff0c;该过程的一个关键方面是分析网络的正常运行时间、可用性、性能和安全性。随着云和物联网技术越来越多地成为现代 IT 环境的一部分&#xff0c;网络管理员必须更加警惕他们授予访问权限的流量&#xff0c;包括确定谁在使用他们的网络…

【十四】设计模式~~~行为型模式~~~中介者模式(Java)

【学习难度&#xff1a;★★★☆☆&#xff0c;使用频率&#xff1a;★★★★★】 3.1. 模式动机 建立一种对象与对象之间的依赖关系&#xff0c;一个对象发生改变时将自动通知其他对象&#xff0c;其他对象将相应做出反应。在此&#xff0c;发生改变的对象称为观察目标&#…

提高测试效率5大捷径

1、优先级 测试任务和开发任务一样&#xff0c;都需要进行优先级排序。在测试工作中&#xff0c;优先进行级别高的测试任务&#xff0c;这样能够在无法保障测试周期的前提下&#xff0c;也不会对整体开发进度造成较大的影响。 提高测试效率5大捷径 2、重视测试策略 测试策略的基…

零代码,使用 Dify 两分钟接入企业微信

前置准备 企业微信的管理员权限 一个 Dify 的帐号 一个 Laf 云的帐号 &#xff08;可选&#xff09;一个 OpenAI 的 API Key。如果没有&#xff0c;可以使用 Dify 免费提供的 200 次调用机会用于测试。 &#xff08;可选&#xff09;在电脑上新建一个 env.txt 的文件&#…

C++进阶 —— 列表初始化(C++11新特性)

目录 一&#xff0c;列表初始化 二&#xff0c;类列表初始化 三&#xff0c;类模板列表初始化 库模板初始化列表实现 模拟模板初始化列表实现 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称&…

神经网络与机器学习

《神经网络与深度学习》 第一章 绪论1.1 人工智能知识结构预备知识顶会论文常用的深度学习框架研究领域 1.2 如何开发AIS芒果机器学习 1.3 表示学习局部表示和分布式表示 1.4 深度学习&#xff08;Deep Learning) 第一章 绪论 1.1 人工智能 人工智能的一个子领域 神经网络&a…