【C语言】浮点型数据在内存中的储存

news2024/9/25 19:23:24

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

文章目录

  • 浮点型数据在内存中的储存
    • 引例
    • 概念提出
    • 浮点型数据储存规定
      • 对于有效数字M的特别规定
      • 对于指数E的特别规定
        • 指数E的储存
        • 指数E的读取
    • 利用规则解释原因


在之前学习过整形数据在内存中的储存后,浮点型数据在内存中的储存又会怎样呢?

常见的浮点型包括,float,double,long double类型

引例

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

	*f = 9.0;
	printf("num的值%d\n", n);
	printf("*f的值为%f\n", *f);
	return 0;
}

在这里插入图片描述
通过结果不难发现,*f和num在内存中明明是同一个数,但是浮点型和整形数据的输出结果天差地别,出现这个结果的原因就是,浮点数在计算机内部的存储方式有自己的规则

概念提出

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

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

举例来说,十进制的5.5,写成2进制就是101.1(这里的小数位上的1是因为2^(-1)=0.5),相当于是1.011* 2^2,由此可以得出s=0;M=1.011,E=2;

十进制的-5.0写成二进制是-101.0,相当于-1.01*2^2,那么,S=1;M=1.01,E=2;

浮点型数据储存规定

IEEE 754规定

对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M

在这里插入图片描述

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

对于有效数字M的特别规定

在概念提出部分就有提到,1<=M<2,意思就是M一定是会被写成1.XXXXXXX,那么就可以省略掉1,只保存后面的XXXXXXXX部分

比如说上面的1.01,就只保存01,到读取的时候,再把第一位的1加上去,这样做的目的,就是可以节省一个有效数字的位置

毕竟有效数字的位置是有限的,多省出一个,就更能增加数据的精度

对于指数E的特别规定

指数E的储存

***首先,E是一个无符号整数,(unsigned int),那么如果E为8位,他的取值范围在0~255,如果E为11位,它的取值范围在0 ~2047。但是,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时,E的真实值必须加上一个中间数,对于8位的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.0* 2(-1),其阶码位-1+127=126;表示为01111110.
对于M,尾数1.0的小数部分为0,所以补0补齐23位

0 01111110 00000000000000000000000

E全为0

这时,浮点是指数E等于1-127(1-1023),即为真实值,有效数字M前边不在加1,而是还原为0.XXXXXXXX的小数,这样来表示正负0,或者接近0的很小的数

E全为1

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

利用规则解释原因

对于第一部分的*f
n=9;
9>00000000 00000000 00000000 00001001
将他拆分一下,
得到第一位s=0;,后面的8位指数E=00000000,最后的23位是有效数字M

0 00000000 00000000000000000001001

这里指数E为全0.E=1-127=-126,浮点数V写成

(-1)^0 * 0.00000000000000000001001 * 2^(-126)

显然V是一个很小的接近0的正数,所以用十进制小数表示就是0.000000

对于第二部分
浮点数9.0,存入内存先把他转换成二进制

1001.0,–>(-1) ^0 *1.001 *2^(3)—>s=0;E=3+127=130;M=1.001,
因为尾数1.001的小数部分是001,有效数字M后补0至23位

所以9.0在内存中储存,他的二进制为

0 10000010 00100000000000000000000

这个数还原成十进制数就是一个很大的正数,是1091567616

在按照浮点数从内存读取的规则,用小数表示就是9.000000

需要注意的是:

有很多时候小数部分我们无法非常精确的将他按照浮点型数据的规则精确储存他,例如3.14,小数部分0.14就不容易找到精确的E,并且E只有8个bit位,当计算出来的E的值的二进制位超出8个时,有一部分就会被省略
因此浮点型数据在内存中的储存往往都不是非常精确的

作者有话说:作者只是一个小白,以上仅仅是作者对知识的理解,如有错误或不足,感谢指出,如感到有帮助,请留下一个👍

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

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

相关文章

AI辅助论文写作已成大趋势,这些AI工具分享给你

近年来&#xff0c;人工智能语言模型迅速发展&#xff0c;特别是在美国人工智能研究实验室 OpenAI 于 2022 年 11 月发布了聊天机器人 ChatGPT 后&#xff0c;引发了全球范围内的广泛讨论。人们惊叹着一个新的人工智能时代已经到来&#xff0c;预示着许多工作将被这类机器人所取…

二叉树刷题(1)

二叉树题目讲解&#xff08;1&#xff09; 一、构建二叉树并且遍历&#xff08;1&#xff09;思路&#xff08;2&#xff09;代码 二、对称二叉树1、思路2、代码 三、相同的树1、思路2、代码 四、单值二叉树1、思路2、代码 五、另一棵树的子树1、思路2、代码 一、构建二叉树并且…

【Rust日报】一本新书:黑帽Rust

2024 Rust中国大会大会将于 9 月 07 日 - 08 日在上海举办。精彩议题逐步放出中&#xff0c;欢迎大家面对面交流。 2024 Rust中国大会报名链接暨第一批精彩演讲主题介绍 2024 Rust中国大会第二批精彩演讲主题列表 2024 Rust中国大会第三批精彩演讲主题列表 马尔科夫文本生成算法…

多线程(5)——锁策略、CAS、JUC常见类

1. 常见锁策略 1.1 乐观锁 & 悲观锁 乐观锁 & 悲观锁 也不是指具体某个锁&#xff0c;而是 “锁的一种特点”&#xff0c;描述了 “一类锁” 乐观锁&#xff1a;加锁的时候&#xff0c;假设出现锁冲突的概率不大 > 接下来围绕加锁要做的工作就会更少悲观锁&#…

minio 后端大文件分片上传,合并,删除分片

背景 网上大多数minio大文件上传都是采用后台返回前端预上传链接&#xff0c;然后由前端去put请求直接和minio通信上传分片文件&#xff0c;然后调用后台合并分片逻辑来达到快申诉上传的目的&#xff0c;详情可以参考我的上两篇文章 最近有个项目域名是https的&#xff0c;但…

# 低代码和无代码开发初探

低代码和无代码开发初探 低代码和无代码都是近年来在软件开发领域兴起的技术趋势&#xff0c;它们旨在提高开发效率、降低开发门槛&#xff0c;让更多人能够参与到软件开发过程中。以下是对低代码和无代码的介绍&#xff1a; 一、低代码 1、低代码定义 低代码开发平台&…

Linux nice/renice 命令 - 进程的NI、PRI属性

进程NI、PRI属性的联系 共同影响进程调度&#xff1a;NI和PRI都是Linux进程调度机制中的重要参数&#xff0c;它们共同决定了进程在CPU资源竞争中的优先级。NI值通过影响PRI值来间接影响进程的调度顺序。NI值可调整以改变PRI值&#xff1a;用户可以通过调整进程的NI值来间接改…

较难!第15届蓝桥杯青少组省赛Scratch中级组编程真题

今天上午第15届蓝桥杯青少组省赛Scratch初级组考完试以后&#xff0c;Scratch实验室就预估今天下午的Scratch中级组比较难&#xff0c;结果不出所料&#xff0c;还是比较有难度&#xff0c;据好几个学生及家长说&#xff0c;好几道题不会做时间不够。 来源&#xff1a;结束啦&a…

三级_网络技术_43_综合题(报文)

一、 某客户机使用DHCP获取IP地址等信息&#xff0c;其获取lP地址过程中捕获的4条报文及对第2条报文分析如下所示。请分析其中的信息&#xff0c;补全内容。 编号 报文摘要 DHCP:Request, Type:DHCP discover DHCP:Reply, Type:DHCP__________ DHCP:Request, Type:DHCP Re…

DBeaver安装使用

文章目录 简介支持的数据库支持的系统 下载安装DBeaver使用修改Maven下载jar地址窗口->首选项连接->驱动->Maven配置仓库地址 选择需要连接的数据库进行连接 简介 DBeaver 是一个通用的数据库管理工具和 SQL 客户端&#xff0c;支持 MySQL, PostgreSQL, Oracle, DB2,…

人生苦短,转行程序员要趁早啊

前言 最近有朋友咨询关于如何自学编程语言的问题&#xff0c;发现要回答这个问题&#xff0c;不是一俩句就可以回答清楚并减少当事人的困惑和迷茫。 笔者不知道提问者是问的学习方法还是学习路径&#xff0c;所以特此写一篇文章&#xff0c;斗胆表达一下我对自学编程的一点点…

解决Gradle下载依赖速度慢的问题

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

盘古信息MES制造执行系统,赋能制造企业智能化运营管理

随着工业智能化的不断深入&#xff0c;MES系统在制造业中扮演着越来越重要的角色。盘古信息自主研发的IMS MES&#xff0c;通过提供包括制造数据管理、计划排程管理、生产调度管理、库存管理、质量管理、人力资源管理、设备管理、采购管理、成本管理、看板管理、生产过程控制、…

TCP粘包和抓包

在 TCP 套接字中&#xff0c;发送和接收缓冲区用于暂存数据&#xff0c;以确保数据的可靠传输。具体来说&#xff0c;TCP 的 socket 收发缓冲区的主要特点和概念如下&#xff1a; 1. 发送缓冲区&#xff08;Send Buffer&#xff09; 定义: 发送缓冲区用于存储待发送的数据。应…

如何在不格式化的情况下解锁 Android 智能手机密码

如果您忘记密码&#xff0c;您的 Android 移动设备将锁定您。发生这种情况时&#xff0c;通常可以通过恢复出厂设置来重新获得对设备的访问权限。可悲的是&#xff0c;这将导致所有数据丢失。下面列出的是解锁锁定的Android 手机而不会丢失任何个人数据的有效方法。 Android 手…

排查Maven问题的步骤

0.检查pom文件完整性 1.检查IDEA中配置是否正确 2.使用清楚工具将所有的lastupdate清除, 3.有些依赖是公司的依赖 —>配置私服 —>拷贝同事仓库,覆盖自己的仓库 4.有了私服地址,但是还是下载不到 —>查看地址是否能访问 —>挂VPN

linux多进程与多线程总结

这里写自定义目录标题 2 linux多进程与多线程2.1 进程间通信2.1.1 管道2.1.2 信号2.1.3 消息队列2.1.4 共享内存 3 线程4 IO多路复用4.1 非阻塞IO4.2 IO多路复用 2 linux多进程与多线程 学习并发程序。 linux系统中&#xff0c;使用树型管理进程。因此进程之间有父子关系。通…

如何使用ssm实现学生公寓管理系统的设计与实现

TOC ssm106学生公寓管理系统的设计与实现jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;…

LeetCode.3146.两个字符串的排列差

题目描述&#xff1a; 给你两个字符串 s 和 t&#xff0c;每个字符串中的字符都不重复&#xff0c;且 t 是 s 的一个排列。 排列差 定义为 s 和 t 中每个字符在两个字符串中位置的绝对差值之和。 返回 s 和 t 之间的 排列差 输入输出示例&#xff1a; 思路一&#xff1…

TMC2209模块开启无限位归零

TMC2209无限位归零配置步骤&#xff1a; 3.1 配置内部采样电阻。具体在GCONF中internal_Rsens 1&#xff1b; 此步发送数据 05 00 80 00 00 00 83 00 3.2 电机电流设置&#xff0c;配置IHOLD_RUN寄存器&#xff1b; 此处发送数据 05 00 90 00 00 16 16 12 3.3 设置失速电流阈…