数据在内存中的存储--浮点数

news2024/11/15 14:05:24

        那么好了好了,宝子们,今天给大家介绍一下 “数据在内存中储存” 的来龙去脉---浮点数,来吧,开始整活!⛳️   

一、数据类型家族(浮点数) 

家族成员:float,double,long double 

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

1.抛砖引玉 :

通过下面的例题一,我们来引入浮点数在内存中的存储是怎么样的?

#define _CRT_SECURE_NO_WARNINGS 1 
#include <stdio.h>
int main()
{
	int n = 9;
	float* p = (float*)&n;
	printf("n的值为:%d\n", n);
	printf("p的值为:%f\n", *p);
	*p = 9.0;
	printf("n的值为:%d\n", n);
	printf("p的值为:%f\n", *p);
	return 0;
}

当我们没有运行,咱们可以猜想一下这4个结果分别是什么呢?

我相信很多小伙伴和我当时想的一样,那么就是:

9

9.000000

9

9.000000

是这个样子的,但是我们看一下实际运行结果是什么样的?

        结果和我们想的不一样,错了一半,为什么呢?我们接下来就开始解释一下这个浮点数在内存中到底是怎样存储的?


三、浮点数存储的关键表达式:浮点数(v)=(-1)^S*M*2^E


 

1.  根据国际标准 IEEE (电气和电子工程协会) 754 ,任意一个二进制浮点数 V 可以表示成下面的形式:
        (-1)^S * M * 2^E
        (-1)^s表示符号位,当 s=0 V 为正数;当 s=1 V 为负数。
        M表示有效数字,大于等于 1 ,小于 2
        2^E表示指数位
2.  我们通过举例来进行对表达式的剖析:
十进制:5.5
二进制:101.1(小数点前的最后一个数字的权重是2^0,那么小数点后按顺序来说就是2^(-1)
,2^(-2)……以此类推。)
转化:1.011*2^2---->(-1)^0*1.011*2^2(S=0,M=1.011,E=2)
        接下来我们以float为数据类型来讲解一下浮点数在内存中的存储:
表达式中的字母顺序是S M E,但是浮点数在内存中存储的顺序是S E M
对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。

 对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

但是别看的这么简单,还有一个特别需要注意的点,就是E和M的储存都有特殊情况:

      3.   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 位有效数字。(在这种情况下可以提高数据的精度)
     4.   至于指数E,情况就比较复杂:(E的存入)
        首先,E 为一个无符号整数( unsigned int
        这意味着,如果E 8 位,它的取值范围为 0~255 ;如果 E 11 位,它的 取值范围为0~2047 。但是,我们知道,科学计数法中的 E 是可以出现负数的,所以 IEEE 754 规定,存入内存时E的真实值必须再加上一个 中间数(无论E是正负,都需要加上中间数来修正
        对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023
        比如,2^10 E 是10 ,所以保存成 32 位浮点数时,必须保存成 10+127=137 ,即 10001001。
     5.  (E的取出):
指数 E 从内存中取出还可以再分成三种情况:
(1)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
(2)E 全为 0
这时,浮点数的指数 E 等于 1-127 (或者 1-1023 )即为真实值,
有效数字 M 不再加上第一位的 1 ,而是还原为
0.xxxxxx 的小数。这样做是为了表示 ±0 ,以及接近于 0 的很小的数字。
(3)E 全为 1
这时,如果有效数字 M 全为 0 ,表示 ± 无穷大(正负取决于符号位 s );
好了,关于浮点数的表示规则,就说到这里。

四、首尾呼应(对前面例题的解释)


  对前半部分的分析:

    int n = 9;
    float* p = (float*)&n;
    printf("n的值为:%d\n", n);//9(在这一步我们以整数的形式放进n里面,再以%d整形来打印出来,完全没有问题,答案就是9)
    printf("p的值为:%f\n", *p);//0.000000

/*9------>0 0000000000000000000000000001001(二进制)

当我们以浮点数的视角来打印出来的时候,我们要分别求出来S M E。

0        00000000        00000000000000000001001

S        E                        M  

1.当E是全0的时候,E=1-127即为真实值。 

2.有效数字M不再加上第一位的1,而是还原为
0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
浮点数v=(-1)^0*0.00000000000000000001001*2^(-126)
因为以%f的形式打印出来浮点数,最终的结果只有小数点的后6位 : 0.000000*/
     对后半部分的分析:

    *p = 9.0;
    printf("n的值为:%d\n", n);//1091567616

/*因为上一部分的代码*p是浮点数,所以我们以浮点数的形式储存9.0。

9.0

1001.0=1.001*2^3

又因为9.0是正数,所以s=0

9.0==(-1)^0*1.001*2^3

内部的储存结果如下:

0        10000010        00100000000000000000000

S        E                        M        

当我们以整形的形式打印出来的时候,又因为它是个正数,所以说打印出来的时候正数的原码反码补码相同:

最终的结果直接就是他:01000001000100000000000000000000

然后再以二进制读出来:1091567616*/
    printf("p的值为:%f\n", *p);//这个地方等于9.000000没有疑问

 

 

好了,今天的分享就到这里了

如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!

请添加图片描述

 

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

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

相关文章

通过 docker-compose 快速部署 Kafka 保姆级教程

一、概述 Kafka是由Apache基金会开发的分布式流处理平台&#xff0c;采用发布-订阅模式&#xff0c;支持高吞吐量、低延迟的数据传输。主要用于处理实时数据管道、数据存储和数据分析等大数据应用场景。Kafka采用高效的数据压缩算法&#xff0c;可以在集群中存储大量的数据&am…

相约未名湖畔,百度商业AI技术创新大赛携手北大学子共探AI发展

火热六月&#xff0c;百度商业AI技术创新大赛正在如火如荼的进行&#xff0c;百度商业与高校合作展开全国巡回宣讲会&#xff0c;吸引高校学子参与&#xff0c;激发创新思维&#xff0c;为科技发展注入源源不断的新生力量。6月6日&#xff0c;百度商业AI技术创新大赛走进北京大…

CSPM项目管理专业人员能力等级评价各级考试题目由什么构成?

2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项…

智能存储柜的种类和特点分析

近年来随着网络技术的发展和人们对社会发展服务水平的需求不断提高&#xff0c;智能产品越来越普及&#xff0c;生活中也出现了越来越多的智能存储柜&#xff0c;应用于商场、超市、企业、工厂等场景&#xff0c;使用方便、保密性强、可靠性高。 智能存储柜种类非常多&#xff…

TIOBE 6月榜单出炉!AI影响到Python第一的位置?

TIOBE 6月榜单已经发布了&#xff0c;一起来看看这个月编程语言排行榜有什么变化吧&#xff01; Python第一宝座岌岌可危 在过去的几年中&#xff0c;Python已经5次获得TIOBE指数年度奖项。由于数据科学和人工智能领域的推动&#xff0c;它越来越受欢迎。自 2021 年 10 月起&a…

大模型热潮来袭,AI基础软件深度赋能金融行业数智化升级

近日&#xff0c;由中国金融电子化集团有限公司、南京市建邺区人民政府主办的“2023 中国金融业数字化转型发展大会暨第十三届中国城市商业银行信息化发展创新座谈会”在南京盛大举办。九章云极DataCanvas公司副总裁周晓凌受邀出席会议&#xff0c;并发表“大模型时代的银行AI中…

前端必须掌握的HTML知识

前端开发者必须掌握的HTML知识包括&#xff1a; HTML基础语法&#xff1a;HTML标签、属性、值等基础语法。 HTML文档结构&#xff1a;HTML文档的基本结构&#xff0c;包括、、等标签的使用。 HTML元素&#xff1a;常用的HTML元素&#xff0c;如文本元素、图像元素、链接元素、…

【有奖调研】互联网新型社交,华为在找“元服务搭子”,快来集合!

“聊技术无话不谈&#xff0c;一起来吹吹元服务&#xff01;畅聊你对元服务的想法&#xff0c;说不定&#xff0c;你就能撬动元服务的爆发增长&#xff01;” 元服务&#xff08;即原子化服务&#xff09;是华为“轻量化”服务的新物种&#xff0c;可提供全新的服务和交互方式…

【C++】 STL(上)STL简述、STL容器

文章目录 简述STL容器list链表vector向量deque双端队列map映射表set集合hash_map哈希表 简述 STL是“Standard Template Library”的缩写&#xff0c;中文译为“标准模板库”。STL是C标准库的一部分&#xff0c;位与各个C的头文件中&#xff0c;即他并非以二进制代码的形式提供…

【Linux】解决Linux无法联网的一个小问题

今天使用在虚拟机VMware中使用Linux系统&#xff08;Centos7&#xff09;的时候&#xff0c;发现不能联网&#xff0c;找了很多办法也没有解决&#xff0c;甚至重新安装也没有解决&#xff0c;后来想起之前的解决方案。 要在任务管理器中打开&#xff0c;VMware的网络管理。

量子 金融,将改变游戏规则?

光子盒研究院 前言&#xff1a;如今&#xff0c;量子技术早已走出实验室、广泛赋能电力、化学、医学等各个领域&#xff1b;创新赛道上&#xff0c;加速奔跑的量子产业&#xff0c;将带来无限可能。现在&#xff0c;光子盒特开启「量子」专栏&#xff0c;一一解读量子技术将为下…

简易实现无缝切换自动轮播

原理 页面中设置一个父盒子 bannerBox&#xff0c;固定宽高&#xff0c;相当于一个窗口&#xff0c;超出部分隐藏bannerBox 内部设置一个图片盒子 imgBox&#xff0c;横向&#xff08;或纵向&#xff09;依次排列图片添加定时器&#xff0c;每隔一段时间&#xff0c;imgBox 向…

解决使用html标签自定义的按钮点击时有背景底色的问题

问题描述 如下图所示&#xff0c;点击按钮的瞬间&#xff0c;元素底部会出现一个背景色 解决方法 在点击产生背景色的元素的css样式上加上以下代码&#xff1a;-webkit-tap-highlight-color: transparent;

《Unix环境高级编程》/bin/sh: ./fixup.awk: Permission denied

我的代码是从http://www.apuebook.com/code3e.html下载的&#xff0c;先是在 使用cat /etc/redhat-release看到操作系统是CentOS Linux 7.6&#xff0c;使用uname -r看到内核是3.10.0-957.el7.x86_64。 在代码顶级目录下&#xff0c;执行make。 发现报错&#xff1a; ./fi…

软件测试-基础

目录 软件测试的生命周期 如何描述bug 定义bug的级别 bug的生命周期 如何发现更多的bug 软件测试的生命周期 软件测试的生命周期包括: 需求分析->测试计划->测试设计,测试开发->测试执行->测试评估 需求分析:测试人员了解需求,分析需求是否完整,是否正确合…

idea git项目错乱显示多个git项目记录

在项目的.idea文件夹下找到vcs.xml 删除无用的mapping&#xff0c;例如上图&#xff0c;删除…/的目录即可

面试官虐我千百遍,我仍待他如初恋,阿里、腾讯、蚂蚁金服Java技术面试及经验总结

能够进一线互联网公司&#xff0c;是大部分程序员奋斗的目标&#xff0c;有很多小伙伴可能因为学历望而止步&#xff0c;其实只要能力够&#xff0c;学历真的不是那么重要&#xff01; 今天给大家带来ATM(阿里巴巴&#xff0c;腾讯&#xff0c;蚂蚁金服)的Java面试真题&#x…

有效延缓痴呆症:延世大学发现梯度提升机模型能准确预测 BPSD 亚综合征

内容一览&#xff1a;随着人口老龄化程度不断加剧&#xff0c;痴呆症已经成为公共健康问题。目前医学界治疗该病还只能通过药物缓解&#xff0c;尚未发现治愈的有效方法&#xff0c;因此&#xff0c;预防痴呆症尤为紧迫。在这一背景下&#xff0c;延世大学的研究人员开发了多个…

90v转5v芯片

摘要&#xff1a;AH8691内置MOS降压型开关芯片&#xff1a;为电动车控制器供电、通信和太阳能充电设备充电提供解决方案 问&#xff1a;什么是AH8691芯片&#xff1f; 答&#xff1a;AH8691是一款内置MOS降压型开关芯片&#xff0c;可将输入电压范围从10V至100V降压转换为稳定…

软件测试必备7大技能

一、测试用例的编写 1.在测试中最重要的文档&#xff0c;他是测试工作的核心&#xff0c;是一组在测试时输入输出的标准&#xff0c;是软件需求的具体对照。编写测试用例&#xff0c;是测试人员的基本功&#xff0c;真正能写好的人并不多。 2.测试用例包含的内容&#xff1a;…