数据在内存的存储(2)【浮点数在内存的存储】

一.浮点数以什么形式存储在内存中

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

V=(-1)^S*M*2^E。

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

(2)M表示有效数字,M是大于等于1,小于2的

(3)2^E表示指数位。

举个例子:比如5.0,写成二进制是101.0,相当于1.01*2^2。则S=0,M=1.01,E=2.

                  比如-5.0,相当于-1.01*2^2。则S=1,M=1.01,E=2.

                  再比如5.5,二进制是101.1,所以为1.011*2^2.则S=0,M=1.011,E=2.

IEEE 754规定:

对于32位的浮点数(float),最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M.

对于64位的浮点数(double),最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M.

这就是关于浮点数在内存中最基础的存储。

二.浮点数存的过程

前面我们说,M我们可以写成1.xxxxx的形式,其中xxxxx是小数部分。当我们保存M的时候,默认这个数的第一位总是1。因此我们可以把这个1舍去,只保存后面的xxxxxx。比如我们存储1.011的时候,只保存011,等到读取的时候,再把第一位的1加上去。这样我们就可以节省出1位有效数字,就像是M本来只能储存23位,但是省去了第一位后,相当于我们最多可以存储24位。

关于E的存储,就有些复杂了,首先它必须是一个无符号的整数。假如E为8位,它的取值范围就是0~255,如果为11,就是0~2047。但是我们知道,这个是指数,科学计数法里是可以出现负数的,所以IEEE 754规定,存入内存的E必须加上一个中间数,对于8位的E,中间数就是127。11位的就是1023.比如,2^10,我们保存成32位时,我们需要保存成137,也就是10001001。

大家注意,float类型是有最大值和最小值的。所以我们的E肯定也是有最大值和最小值的。不过我们不用担心我们加上127或者1023会超出这个范围。

来给大家举个例子

至于为什么是反过来的,可以看我上一篇博客,关于大小端存储的内容。

注意这里我举的例子是5.5在内存中可以精确保存的,但是像是3.14,1.1等等这些数字,是无法再内存中精确保存的。因为我们数据是以二进制存储的,小数点后面是2^-1,2^-2等等,这样的数据对于32位的float是无法精确保存的。

三.浮点数取的过程

1.E不全为1或不全为0

比如0.5的存储

0 01111110 0000000000000000000000

这个最好理解,当我们把存入内存的数据取出来的时候,先把指数E减去127或者1023,得到真实值,再将有效数字M前加上第一位的1(因为我们在存的时候不是把这个省去了吗)。整体的步骤实际上就是把我们存进去的时候完全反了过来。

2.E全为0

0 00000000 00100000000000000000000

这是一种特殊情况,这个时候的E等于1-127或者1-1023这个就是真实值,有效数字M不再加上第一位的1,而是还原成0.xxxxxx的小数。这样做是为了表示±0,以及接近0的很小的数字。

3.E全为1

0 11111111 00100000000000000000000

这个也是一个特殊情况,这里我们有八个1,表示的十进制数是255,大家可以想想,因为我们是加完127之后得到的这个数字,那么真实值就是255-127=128。那么也就是说,这个数字是2^128这是一个天文数字。所以它就表示的是正负无穷大的数字。

四.练习

来看一下这四个输出的是什么结果。

#include<stdio.h>
int main()
{
	int a = 9;
	float* pfloat = (float*)&a;
	printf("a=%d\n", a);
	printf("*ploat=%f\n", *pfloat);

	*pfloat = 9.0;
	printf("a=%d\n", a);
	printf("*ploat=%f", *pfloat);
	return 0;
}

这个就要用到我刚才写的那些内容了。

第一个printf就不用多说,输出的肯定是9。

第二个值是几呢?9的二进制是1001,补成32位之后是00000000000000000000000000001001,这里我们把a的地址取出来,因为&a的类型是int*所以这里肯定要强制转换成float*。此时的pfloat指向的就是一个float*类型的a。站在pfloat的角度,它会认为自己指向的是一个float的类型。所以这里的32位就会被理解成是用浮点数存储的方式。也就是

0 00000000 00000000000000000001001

这种情况就是我们上面说的E为全0的特殊情况。E的值就是-126,有效数字M也不再加上第一位的1.所以这里就是(-1)*0.00000000000000000001001*2^-126这个值就直接约等于0了。

第二个打印出来结果:0.000000

第三个的结果我们是把浮点数类型的9.0用%d打印出来,其实只要理解了第二个这一个也不算难了。回想一下浮点数在内存的存储。9.0的二进制是1001.0也就是(-1)^01.001*2^3.S=0,E=3,M=1.001。所以0 10000010 00100000000000000000000这个就是9.0在内存的存储。但是这里打印的是用%d打印,认为内存里的是有符号说,所以这里的最高位0代表的就是正。而正数的原码,反码和补码都是一样的。所以我们就按照这个原码来打印出来。

第三个打印出来的结果:1,091,567,616

这那么最后一个打印出来的这个就是以浮点数的形式打印的,所以就是9.000000

好了,到这里就把数据在内存中的存储就全部讲完了。感谢大家的观看,如有错误,请大家多多指出。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unix环境高级编程-学习-08-自旋锁与屏障

目录 一、多线程相关文章链接 二、自由抒发 1、自旋锁 2、屏障 三、函数介绍 1、pthread_spin_init &#xff08;1&#xff09;声明 &#xff08;2&#xff09;作用 &#xff08;3&#xff09;参数 &#xff08;4&#xff09;返回值 &#xff08;5&#xff09;注意点 …

docker centos7安装jdk1.8(在线和离线方式)

目录 1.在线方式1.1.进入容器1.2.使用yum安装openjdk1.3.配置环境变量 2.离线方式2.1.下载jdk安装包2.2.解压2.3.配置环境变量 3.可能遇到的问题 1.在线方式 1.1.进入容器 1.2.使用yum安装openjdk # 安装JDK1.8 yum install java-1.8.0-openjdkjava -version1.3.配置环境变量…

RPA-财务对账邮件应用自动化(客户对账机器人)

《财务对账邮件应用自动化》&#xff0c;将会使用邮箱的SMTP服务&#xff0c;小北把资源包绑定在这篇博客了 Uibot (RPA设计软件)———机器人的小项目友友们可以参考小北的课前材料五博客~ (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; …

Netty学习——源码篇6 Pipeline设计原理 备份

1 Pipeline设计原理 在Netty中每个Channel都有且仅有一个ChannelPipeline与之对应&#xff0c;它们的组成关系如下图&#xff1a; 通过上图可以看到&#xff0c;一个Channel包含了一个ChannelPipeline&#xff0c;而ChannelPipeline中又维护了一个由ChannelHandlerContext组成的…

零基础学python之高级编程(6)---Python中进程的Queue 和进程锁,以及进程池的创建 (包含详细注释代码)

Python中进程的Queue 和进程锁,以及进程池的创建 文章目录 Python中进程的Queue 和进程锁,以及进程池的创建前言一、进程间同步通信(Queue)二、进程锁&#xff08;Lock&#xff09;三、创建进程池Poorpool 类方法: End! 前言 大家好,上一篇文章,我们初步接触了进程的概念及其应…

【随笔】Git -- 常用命令(四)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

第16篇:奇偶校验器

Q&#xff1a;本期我们将实现4位奇偶校验逻辑电路&#xff0c;即校验4位二进制代码中 “1” 的个数是奇数或偶数。 A&#xff1a;奇偶校验器的基本原理&#xff1a;采用异或运算对“1”的奇偶个数进行校验&#xff0c;从最高位依次往最低位进行连续异或运算。如果最后的异或运…

stm32控制电机--计算电角度以及电角度和机械角度的对应关系---以及foc的控制算法模型及过程(推荐)

1&#xff0c;电角度和机械角度的关系 如何区分电角度和机械角度&#xff1f; 2&#xff0c;foc模型工程&#xff08;推荐&#xff09; SimpleFOC移植STM32&#xff08;四&#xff09;—— 闭环控制 注意速度需要进行低通滤波

使用Docker Compose一键部署前后端分离项目(图文保姆级教程)

一、安装Docker和docker Compose 1.Docker安装 //下载containerd.io包 yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm //安装依赖项 yum install -y yum-utils device-mapper-persistent-data l…

消费电子回暖之际,手机回收厂商如何持续释放“绿色潜力”?

春天到来的暖意&#xff0c;正在消费电子产业链上下游蔓延。 仅就手机这一品类而言&#xff0c;可以看到&#xff0c;2023年手机厂商已经度过寒冬&#xff0c;中国信息通信研究院发布的数据显示&#xff0c;2023年1-12月&#xff0c;我国手机总体出货量累计2.89亿部&#xff0…

新生儿奶瓶怎么选择?5款口碑榜单奶瓶推荐

新生儿奶瓶是每个新手爸妈都要选择的喂养产品&#xff0c;除了喂养宝宝外&#xff0c;还能帮助宝宝渡过戒奶期。然而近年来&#xff0c;市面上出现一些低质量、劣质材料制成的奶瓶&#xff0c;频频被爆安全隐患&#xff0c;给消费者带来极大的不便和风险。那么你知道什么牌子的…

Linux的学习之路:1、发展史与编译环境的搭建

一、发展史 1991年10月5日&#xff0c;赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组 &#xff08;comp.os.minix&#xff09;中宣布他编制出了一种类似UNIX的小操作系统&#xff0c;叫Linux。新的操作系统是受到另一个UNIX的小操作系统——Minix的启发…

Cisco firepower 2140 run ASA and config failover

1 背景 here we got 2 cisco firepower 2140 hardware appliance we’re planning to run ASA on it. and config failover for Primary Unit and Secondary Unit 现场2台Cisco firepower 2140防火墙&#xff0c; 运行ASA模式&#xff0c; 双机组HA&#xff0c;心跳线使用E1/1…

服务器基础知识(物理服务器云服务器)

今天我们来介绍一下服务器的基础知识 一、服务器硬件基础知识 组件说明中央处理器&#xff08;CPU&#xff09;CPU是服务器的大脑&#xff0c;负责执行计算任务和指令。服务器通常配备多个CPU核心&#xff0c;以支持并行处理和提高性能。关键的CPU性能指标包括时钟频率、核心数…

sonarqube使用指北(三)-编写代码进行自动化扫描

一、引言 上一篇文章之后 我们应该已经成功完成的配置了扫描环境并执行了一次基本的本地扫描,但是之前的手动扫描需要我们每一次都手动切换到代码目标并手动执行扫描命令,效率很低。在代码库较大的情况下会占用大量的时间。这一章我们会通过编写python代码的形式来实现自动化…

Python学习:循环语句

Python循环语句 概念 循环语句是编程中常用的结构&#xff0c;用于多次执行相同或类似的代码块。Python中有两种主要的循环语句&#xff1a;for循环和while循环。 for循环&#xff1a; for循环用于遍历一个序列&#xff08;如列表、元组、字符串等&#xff09;中的元素&#x…

二十二、软考-系统架构设计师笔记-真题解析-2018年真题

软考-系统架构设计师-2018年上午选择题真题 考试时间 8:30 ~ 11:00 150分钟 1.在磁盘调度管理中&#xff0c;应先进行移臂调度&#xff0c;再进行旋转调度。假设磁盘移动臂位于21号柱面上&#xff0c;进程的请求序列如下表所示。如果采用最短移臂调度算法&#xff0c;那么系统…

PyPy为什么能让Python比C还快?一文了解内在机制

「如果想让代码运行得更快&#xff0c;您应该使用 PyPy。」—— Python 之父 Guido van Rossum 对于研究人员来说&#xff0c;迅速把想法代码化并查看其是否行得通至关重要。Python 是能够实现这一目标的出色语言&#xff0c;它能够让人们专注于想法本身&#xff0c;而不必过度…

万亿功能性食品市场爆火,北美膳食健康品牌GNITE如何抓住“朋克养生”年轻人!

近几年&#xff0c;年轻人的养生意识不断提升&#xff0c;“吃出健康”理念盛行&#xff0c;在中国年轻人独有的“懒养生”理念加持下&#xff0c;功能性软糖精准击中年轻人的健康焦虑&#xff0c;助眠、美白、护眼、补铁、减脂……等产品在新消费领域兴起&#xff0c;消费热度…