C语言——深度剖析数据在内存中的存储——第2篇——(第25篇)

news2024/11/16 23:48:06

坚持就是胜利

文章目录

  • 三、浮点型在内存中的存储
    • 1、一个例子
    • 2、浮点数存储规则
      • 1、IEEE 754对 有效数字M 和 指数E ,还有一些特别规定。
      • 2、至于 指数E,情况比较复杂,首先,E 为 一个无符号整数(unsigned int)
      • 3、然而,指数 E 从内存中 取出 还可以再分成三种情况
        • (1)E 不全为 0 或者 不全为 1
        • (2)E 全为 0
        • (3)E 全为 1
    • 3、题目讲解
    • 4、区别

三、浮点型在内存中的存储

常见的浮点数:
3.14159
1E10
浮点数家族包括:float、double、long double 类型
浮点数表示的范围:float.h
整型表示的范围:limits.h

1、一个例子

浮点数存储的例子:

以下例子说明:整型和浮点型在内存中的存储方式是有差异的。

#include <stdio.h>

int main()
{
	int n = 9;
	float* pFloat = (float*)&n;

	printf("n的值为:%d\n", n);               //结果:9 
	printf("*pFloat的值为:%f\n", *pFloat);   //结果:0.000000

	*pFloat = 9.0;
	printf("num的值为:%d\n", n);             //结果:1091567616
	printf("*pFloat的值为:%f\n", *pFloat);   //结果:9.000000

	return 0;
}

在这里插入图片描述

2、浮点数存储规则

num 和 *pFloat 在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?
要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。
详细解读:
根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数 V 可以表示成下面的形式:

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

十进制的5.0,写成二进制是101.0,相当于1.01X2^2。
那么,按照上面 V 的格式,可以得到:S=0,M=1.01,E=2。
十进制的-5.0,写成二进制是-101.0,相当于-1.01X2^2。
那么,S=1,M=1.01,E=2。
在这里插入图片描述
E 也可以为 负数
在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述
对于 64位 的 浮点数,最高的 1 位是 符号位 S,接着的 11 位是 指数E,剩下的 52 位有效数字 M。
在这里插入图片描述

1、IEEE 754对 有效数字M 和 指数E ,还有一些特别规定。

前面说过,1<= M < 2 ,也就是说,M 可以写成 1.XXXXXX 的形式,其中XXXXXX表示小数部分。

IEEE 754规定,在计算机内部保存 M 时,默认这个数的第一位总是 1,因此可以被舍去,只保存后面的XXXXXX部分。

比如保存 1.01 时:

只保存 01 ,等到读取的时候,再把第一位的 1 加上去。

这样做的目的,是节省 1 位有效数字。以 32 位浮点数为例,留给 M 只有 32 位,将第一位的 1 舍去以后,等于可以保存 24 位有效数字。

在这里插入图片描述

2、至于 指数E,情况比较复杂,首先,E 为 一个无符号整数(unsigned int)

E 为 无符号整数,这意味着,
如果 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。

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>

int main()
{
	float f = 5.5;
	//二进制:101.1
	//1.011 * 2^2
	//(-1)^0 * 1.011 * 2^2
	//S = 0
	//M = 1.011  存入小数点后面的:011  一共23位,即:01100000000000000000000
	//E = 2  存入内存:2+127=129,即为:1000 0001
	//二进制:0 10000001 01100000000000000000000
	//0100 0000 1011 0000 0000 0000 0000 0000
	//十六进制:0x40b00000
	return 0;
}

3、然而,指数 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)

在这里插入图片描述

3、题目讲解

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>

int main()
{
	int n = 9;
	//整数n 00000000 00000000 00000000 00001001
	//0 00000000 00000000000000000001001
	//S E        M
	//S=0
	//E=1-127=126 (E全为0)
	//M=0.00000000000000000001001  (不再加上首位数字 1 )
	//(-1)^0*0.00000000000000000001001*2^(-126)
	//%f只能显示小数点后6位,因此答案显示:0.000000
	float* pFloat = (float*)&n;

	printf("n的值为:%d\n", n);               //结果:9 
	printf("*pFloat的值为:%f\n", *pFloat);   //结果:0.000000

	*pFloat = 9.0;
	//浮点数二进制 1001.0
	//1.001 * 2^3
	//(-1)^0 * 1.001 * 2^3
	// E=3+127=130   1000 0010
	//S=0  E=1000 0010  M=00100000000000000000000  
	//0 1000 0010 0010000000000000000000
	//0100 0001 0001 0000 0000 0000 0000 0000
	//4      1    1   0    0     0    0    0
	//0x41100000
	//十进制:1091567616
	printf("num的值为:%d\n", n);             //结果:1091567616
	printf("*pFloat的值为:%f\n", *pFloat);   //结果:9.000000

	return 0;
}

4、区别

强制类型转换 (int)3.14 得到的值是 :3
这与上面的从内存中取数的方式是截然不同的。
不要将从内存中取数 和 强制类型转化 混在一起,这两个是完全不同的。

微软雅黑字体
黑体
3号字
4号字
红色
绿色
蓝色

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

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

相关文章

防御保护:防火墙内容安全

一、IAE&#xff08;Intelligent Awareness Engine&#xff09;引擎 二、深度检测技术(DFI和DPI&#xff09; 1.DPI – 深度包检测技术 DPI主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之后对数据包的内容进行识别。&#x…

c# .net8 香橙派orangepi + hc-04蓝牙 实例

这些使用c# .net8开发&#xff0c;硬件 香橙派 orangepi 3lts和 hc-04蓝牙 使用场景&#xff1a;可以通过这个功能&#xff0c;手机连接orangepi进行wifi等参数配置 硬件&#xff1a; 1、带USB口的linux开发板orangepi 2、USB 转TTL 中转接蓝牙&#xff08;HC-04) 某宝上买…

openGauss学习笔记-230 openGauss性能调优-系统调优-配置并行查询功能

文章目录 openGauss学习笔记-230 openGauss性能调优-系统调优-配置并行查询功能230.1 适用场景与限制230.2 资源对SMP性能的影响230.3 其他因素对SMP性能的影响230.4 配置步骤 openGauss学习笔记-230 openGauss性能调优-系统调优-配置并行查询功能 openGauss的SMP并行技术是一…

双流机场到天府机场ADS-B数据导入MATLAB

MATLAB导入数据 导入的数据Excel部分截图&#xff1a; 一些处理 % 导入外部轨迹数据并转成标准形式 clear;clc; %% 导入&预处理 [NUM,TXT,RAW]xlsread(2021年10月31日CTU-TFU); time_cell RAW(3:end,1); %拉取时间数据&#xff08;cell&#xff09; time_char char(t…

【清理mysql数据库服务器二进制日志文件】

清理前后比对 清理前占用 86% &#xff1a; 清理后占用 29% &#xff1a; 排查占用磁盘较大的文件 检测磁盘空间占用 TOP 10 # 检测磁盘空间占用 TOP 10 $ sudo du -S /var/log/ | > sort -rn | # -n选项允许按数字排序。-r选项会先列出最大数字&#xff08;逆序&#x…

智慧应急:构建全方位、立体化的安全保障网络

一、引言 在信息化、智能化快速发展的今天&#xff0c;传统的应急管理模式已难以满足现代社会对安全保障的需求。智慧应急作为一种全新的安全管理模式&#xff0c;旨在通过集成物联网、大数据、云计算、人工智能等先进技术&#xff0c;实现对应急事件的快速响应、精准决策和高…

eltable 合计行添加tooltip

eltable 合计行添加tooltip 问题描述&#xff1a; eltable 合计行单元格内容过长会换行&#xff0c;需求要求合计行数据超长显示 … &#xff0c;鼠标 hover 时显示提示信息。 解决方案&#xff1a;eltable合计行没有对外的修改接口&#xff0c;想法是 自己实现一个tooltip&a…

代码随想录刷题笔记-Day25

1. 分割回文串 131. 分割回文串https://leetcode.cn/problems/palindrome-partitioning/ 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xf…

vue使用gitshot生成gif

vue使用gitshot生成gif 问题背景 本文将介绍vue中使用gitshot生成gif。 问题分析 解决思路&#xff1a; 使用input组件上传一个视频&#xff0c;获取视频文件后用一个video组件进行播放&#xff0c;播放过程进行截图生成图片数组。 demo演示上传一个视频&#xff0c;然后生…

Linux:Kubernetes(k8s)——基础理论笔记(1)

我笔记来源的图片以及共享至GitHub&#xff0c;本章纯理论。这是k8s中部分的基础理论 &#x1f447; KALItarro/k8spdf: 这个里面只有一个pdf文件 (github.com)https://github.com/KALItarro/k8spdf&#x1f446; 什么是kubernetes kubernetes 是一个开源的&#xff0c;用于管…

spring boot学习第十三篇:使用spring security控制权限

该文章同时也讲到了如何使用swagger。 1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

【亚马逊云科技】通过Amazon CloudFront(CDN)快速访问资源

文章目录 前言一、应用场景二、【亚马逊云科技】CloudFront&#xff08;CDN&#xff09;的优势三、入门使用总结 前言 前面有篇文章我们介绍了亚马逊云科技的云存储服务。云存储服务主要用于托管资源&#xff0c;而本篇文章要介绍的CDN则是一种对托管资源的快速访问服务&#…

Android studio (一) 新建一个Android项目 编程语言为Java

一、下载Android studio 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 这里我下载的是2023年的 二、新建项目 选择如下模板。 填写项目名、项目保存位置、编程语言、最低支持Android API的版本、打包编译模式 三、报错Connection refused: no …

Python实现向量自回归移动平均与外生变量模型(VARMAX算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 向量自回归移动平均与外生变量模型&#xff08;Vector Autoregression Moving Average with Exogenous…

2023年09月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

一、单选题(共10题,共30分) 第1题 我国第一台大型通用电子计算机使用的逻辑部件是( )。 A:集成电路 B:大规模集成电路 C:晶体管 D:电子管 答案:D 第2题 默认小猫角色,运行以下程序,小猫会说?( ) A:45 B:50 C:55 D:60 答案:C 第3题 列流程图的输出结…

【AUCell打分】:评估一个基因集在单细胞转录组的每个细胞中特定的活性程度

AUCell介绍 AUCell是什么&#xff1a;AUCell使用曲线下面积来计算输入基因集的一个有意义的基因子集是否在每个细胞的表达基因中富集。AUC 分数在所有细胞中的分布允许探索特征的相对表达。由于评分方法是基于排名的&#xff0c;因此 AUCell 与基因表达单位和归一化程序无关。…

如何正确的万无一失的学习python?

W...Y的主页 代码仓库分享 在当今数据驱动的时代&#xff0c;Python已经成为最受欢迎的编程语言之一&#xff0c;无论是在数据科学、机器学习、Web开发还是自动化任务中&#xff0c;Python都扮演着关键的角色。其简洁的语法、强大的库支持以及庞大的社区&#xff0c;使其成为…

Python进阶学习:Pandas--将一种的数据类型转换为另一种类型(astype())

Python进阶学习&#xff1a;Pandas–将一种的数据类型转换为另一种类型(astype()) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&…

【达梦数据库】如何使用idea antrl4插件方式dm sql

使用idea中的antrl插件进行分析 1.打开IDEA&#xff0c;在File—Settings—Plugins中&#xff0c;安装ANTLR v4 grammar plugin插件。 2.加载达梦的语法文件 3.配置生成路径和目录&#xff08;可采用默认&#xff09; 4.编译DmSqlParser.g4 DmSqlLexer.g4 5.输入SQL/输入文件 …

【Vue的单选按钮不选中已解决亲测】

伙计&#xff0c;你是否因为后台给vue前端已经传入了对应的单选按钮的数据&#xff0c;为啥还是不选中呢&#xff01;&#xff1f; 这个问题实话我百度乐很多都不能解决我的问题&#xff0c;最后机智如我的发现乐vue的自身的问题&#xff0c;后端返回的数据类型如果是数字int类…