【C语言】浮点型的存储方式

news2024/9/30 7:22:57

目录

一、浮点型和整型存储方式一样吗?

二、浮点型的存储规则

2.1  S,M,E求法

2.2 如何存放S,M,E 

2.2.1 IEEE 754规定

2.2.2 特别的规定

2.2.3  验证

2.3 取出规则

2.3.1 E不全为0或不全为1

2.3.2 E为全0

2.3.3 E为全1

2.3.4验证

END.


一、浮点型和整型存储方式一样吗?

尝试着做一下,看答案是否和你想得相同,如果不一样,那你算是找对文章了。

答案1:是以整型的方式存储,以整型的方式取出

答案2:是以整型的方式存储,以浮点型的方式取出

答案3:是以浮点型的方式存储,以整型的方式取出

答案4:是以浮点型的方式存储,以浮点型的方式取出

由此我们可以得知,整型的存储方式和浮点型的存储方式是不一样的

二、浮点型的存储规则

2.1  S,M,E求法

根据国际标准IEEE 754,任何一个二进制的浮点数都能表示为以下方式

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

浮点数为正数时S=0,反之S=1

M表示有效数字,在1~2之间(二进制)

2^E表示指数位

用一个实例来帮助大家理解

写出5.5对应的式子

5.5的二进制:101.1(小数点右边是从2的-1次方开始)

S=0(5.5为正数)

E=2(转换成科学计数法:1.011小数点左移两位)

M=1.011

既然浮点型可以用SEM来表示,那我们存放这三个值是不是就间接的把数据存在内存中了

所以在内存中存放浮点型就是在存放SME

2.2 如何存放S,M,E 

2.2.1 IEEE 754规定

 

2.2.2 特别的规定

存储M

在我们取M时会将它转换为1.xxxxxxxx(范围在1~2之间的数),如此我们存储时会一直存放一个不变的数1

IEEE 754规定:在计算机保存M时,默认他的第一位永远是1,因此可以将它舍去,只存储小数点后的数据,这样还可以提高精度

存储E

当我们在内存中存储E时,是从第二位开始的,没有符号位,所以它是一个无符号整数

当它占8位时(float)数据范围0~255,占11位时(double)数据范围0~2047

但是,我们在实际计算中E是可能出现负数的比如0.5

0.5的二进制:0.1

S:0

M:1.0(科学计数法的形式,小数点向右移1位)

E:-1

当E出现负数,但内存中不能表示负数,因为他是无符号类型

IEEE 754规定:再存入真实的E之前要加一个中间数,8位时加127,11位时加1023,如此就可以解决出现负数的情况

2.2.3  验证

我们进行一个简单的验证,同时让大家的记忆更加深刻

如果你在困惑内存中存放的为什么是倒过来的

这涉及到大小端的问题,在上一篇整型数据的存储时详细的讲解了这个问题,在此就不过多赘述

【C语言】整型的存储方式(大小端,原码,反码,补码)

2.3 取出规则

2.3.1 E不全为0或不全为1

S:存的什么就取出什么

E:当E的范围是8位时(float),存的时候+127,取得时候-127,得到的就是真实值

      当E的范围是11位时(double),存的时候+1023,取得时候-1023,得到的就是真实值

 M:存的时候,只存了小数点右边的值,取出来的时候要在前面加上1

2.3.2 E为全0

S:存的什么就取出什么

E:直接用1-127(1-1023)就为真实值

M:不用在加前面的1,直接是0.xxxxxxx

2.3.3 E为全1

存放的是无穷大的数字,存取规则和第一种情况相同。

2.3.4验证

// 这个是上面5.5存进去的列子
// 0 10000001 01100000000000000000000
// S    E          M
// S =0 是正数
// E = (10000001)129 - 127 = 2
// M = 0.011+1 =1.011
// (-1)^S*M*2^E
// 由此可以写出对应的数字

了解了怎样存储和取出浮点型数据,开头的那道程序是否有了不一样的见解

 

答案1和答案4

他们就是整型的方式存储,整型的方式取出,浮点型的方式存储,浮点型的方式取出

这里解析答案2和答案3

int main()
{
	int n = 9;
	float* pFloat = (float*)&n;
	//整型方式存进去的是补码
	//00000000000000000000000000001001		//9的原码,正数的原反补相同
	//浮点型的方式取出,就认为里面存的是浮点类型,要用浮点型的规则取出
	//0 00000000 00000000000000000001001	
	//S    E          M
	//S = 0
	//E = 1-127 = -126
	//M = 0.00000000000000000001001	
	//(-1)*0*0.00000000000000000001001	*2^-128
	//是一个非常小的数字接近于0,float精度不够,所以只能打印出0.000000
	printf("*pFloat的值为:%f\n", *pFloat);

	*pFloat = 9.0;
	//浮点型的方式存进去,整型的方式取出来
	//9的二进制:1001		
	// S = 0
	// E = 3 +127 =130
	// M = 1.001
	//实际在内存中存储的是
	//0 10000010 00100000000000000000000
	//用整型的方式取出,就认为存进去的是补码(正数,原反补相同)
	//01000001000100000000000000000000 (原码)
	//原码换算成十进制为:1,091,567,616
	printf("num的值为:%d\n", n);
	return 0;
}

 

END.

有没有一种豁然开朗的感觉呢?有没有感觉到,生硬的规则下又透露出一丝丝的合理,让我对前辈们又多了一份敬佩。

如果对整型的存储有不清楚的地方,可以翻看我的另一篇文章.

【C语言】整型的存储方式(大小端,原码,反码,补码)

最后送给大家一句名言:

Genius only means hard-working all one's life. ——Mendeleyev  Russian chemist

天才只意味着终身不懈地努力。——俄国化学家 门捷列耶夫

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

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

相关文章

改造冰蝎马,实现免杀之default_aes php

本专栏是笔者的网络安全学习笔记,一面分享,同时作为笔记 文章目录 文章目录文章目录前文链接前言效果目标密码验证功能免杀后话前文链接 WAMP/DVWA/sqli-labs 搭建burpsuite工具抓包及Intruder暴力破解的使用目录扫描,请求重发,漏…

[附源码]Python计算机毕业设计黑格伯爵国际英语贵族学校官网Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

5G无线技术基础自学系列 | 单站点验证概述

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 单站点验证是指在基站硬件安装调试完成…

RNA-seq 详细教程:可视化(12)

学习内容 了解如何为可视化准备数据了解如果利用可视化来探索分析结果火山图可视化热图可视化可视化结果 当我们处理大量数据时,以图形方式显示该信息以获得更多信息,可能很有用。在本课中,我们将让您开始使用探索差异基因表达数据时常用的一…

【数电实验】移位寄存器与计数器

实验四 移位寄存器与计数器 一 实验目的 1 掌握任意进制计数器的构成方法; 2 熟悉双向移位寄存器的使用方法。 二 实验内容 1 任意进制计数器的构成方法: 用中规模集成计数器74HC161和与非门74LS00,构成十进制计数器。要求分别使用同步预…

精华推荐 | 【深入浅出RocketMQ原理及实战】「性能原理挖掘系列」透彻剖析贯穿RocketMQ的事务性消息的底层原理并在分析其实际开发场景

什么是事务消息 事务消息(Transactional Message)是指应用本地事务和发送消息操作可以被定义到全局事务中,要么同时成功,要么同时失败。RocketMQ的事务消息提供类似 X/Open XA 的分布事务功能,通过事务消息能达到分布式事务的最终一致。 事务消息所对应的场景 在一些对…

docker学习笔记(五)单个服务镜像部署

引言 当前微服务项目已经大面积普及,对于新需求迭代上线有许多疑惑的部分,比如线上的某些功能不能重启,在这种情况下我们需要部署和启动项目就不能搞大范围重启或干脆重新制作镜像,这种方式都是不可取的,这时候就需要…

重学webpack系列(二) -- webpack解决的问题与实现模块化的具体实践

只是根据几个想法,我们便创造出了webpack打包工具,它能够根据我们在前端项目中遇到的疑难杂症对症下药,那么这一章我们就一起来探讨一下我们项目落地所遇到的种种问题。 前端实践中的问题 Jsx / Tsx编译问题Less / Scss编译问题TypeScript编…

【Pintos】实现自定义 UserProg 系统调用 | 添加 syscall-nr 系统调用号 | 编写新的参数调用宏

💭 写在前面:本文讲解的内容不属于 Pintos 的 Project 项目,而是关于 userprog 如何添加系统调用的,学习如何额外实现一些功能到系统调用中以供用户使用。因为涉及到 src/example 下的Makefile 的修改、lib 目录下 syscall-nr 系统…

门诊排队叫号系统,有序叫号就诊,适用医院医院、门诊部、诊所等

排队叫号系统,是将互联网信息技术与门诊预约、签到、提醒、叫号、接诊等环节相结合,实现门诊流程式便捷叫号服务。 为助力门诊营造一个良好有序的就诊环境,打造科学合理的就诊流程,今天给大家推荐一款一款便捷排队叫号系统&#x…

Linux基本权限(2)

Linux基本权限(2) 📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要讲解了目录权限,和目录&#…

2022年底,我手里一共负责了30套系统

2022年真是不平凡的一年,往常熙熙攘攘的办公室人越来越少,真是像曹操说的兄弟相继凋零,好似风中落叶啊。 结果人少了,手里的系统一个没少,慢慢年底了,我汇总了一下,手里的系统达到了30来个。 搞…

Linux--基础IO

目录 C文件IO 系统文件IO 接口介绍 系统调用和库函数 文件描述符 open返回值 文件描述符的分配规则 重定向 代码演示 使用dup2系统调用 缓冲区 FILE 理解文件系统 文件系统 inode 软硬链接 静态库和动态库 概念 生成静态库 生成动态库 C文件IO 写文件 #in…

SpringBoot+Prometheus+Grafana 实现自定义监控

1.Spring Boot 工程集成 Micrometer 1.1引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency><groupId>io.micrometer<…

E1. Erase and Extend (Easy Version)(纯暴力+string)

Problem - 1537E1 - Codeforces 这是该问题的简单版本。唯一的区别是对n和k的约束。只有当所有版本的问题都解决了&#xff0c;你才能进行黑客攻击。 你有一个字符串s&#xff0c;你可以对它进行两种类型的操作。 删除字符串的最后一个字符。 复制字符串&#xff1a;s:ss&…

数据结构---堆排序

堆排序JAVA实现和快速排序区别二叉堆的构建&#xff0c;删除&#xff0c;调整是实现堆排序的基础之前博客写了二叉堆&#xff1a; 二叉堆最大堆的堆顶是整个堆中的最大元素。最小堆的堆顶是整个堆中的最小元素。 堆排序步骤&#xff1a; 把无序数组构建成二叉堆。(需要从小到…

ArcGIS基础:等高线数据生成栅格DEM数据

以下操作为生成栅格DEM数据的方法。 一般方法是先创建TIN&#xff0c;然后在转为栅格DEM数据。 原始数据如下&#xff1a;为等高线数据&#xff0c;创建TIN数据需要用到等高线数据的【高程】字段。 声明&#xff1a;数据来源于网络。 工具位于【3D分析工具】下的【TIN】下…

BeanDefinition

1. 前言 Spring最重要的一个概念当属Bean了&#xff0c;我们写的Controller、Service、Dao凡是加了对应注解交给Spring管理的&#xff0c;都是Spring容器中的一个Bean。把我们自己写的类变成一个Bean交给Spring管理有很多的好处&#xff0c;比如我们不用自己去new对象了&#…

ssh+mysql实现的Java web企业人事人力资源管理系统源码+运行教程+参考论文+开题报告

今天给大家演示的是一款由sshmysql实现的Java web企业人事人力资源管理系统&#xff0c;其中struts版本是struts2&#xff0c;本系统功能非常完善&#xff0c;已经达到了可以商用的地步&#xff0c;基本全部实现了整个人力资源管理的所有功能&#xff0c;包括员工档案信息、部门…

jekins集成部署

jekins集成部署1.jekins简介2.Jenkins部署环境3. jekins安装4.配置jekins启动和停止脚本5.插件安装5.1.安装maven插件安装5.2 安装gitee插件5.3 安装Publish Over SSH插件5.4 安装 事件机制插件6.任务构建6.1 构建任务6.2 配置giteeApi令牌6.3 配置gitee源码地址6.4 在build中配…