C语言-数据的存储-浮点数的存储(8.2)​​​​​​​

news/2024/11/23 9:47:20/

目录​​​​​​​

思维导图:

浮点型在内存中的存储

1.1一个经典的例子

1.2 浮点数存储规则

1.3实践举例

写在最后:


思维导图:

浮点型在内存中的存储

1.1一个经典的例子

#include <stdio.h>int main()
{int n = 9;//以整形的形式存储float* pFloat = (float*)&n;//强制类型转换成浮点型的指针printf("n的值为:%d\n", n);//以整形的形式取出printf("*pFloat的值为:%f\n", *pFloat);//以浮点型的形式取出*pFloat = 9.0;//以浮点型的形式存储printf("num的值为:%d\n", n);//以整形的形式取出printf("*pFloat的值为:%f\n", *pFloat);//以浮点型的形式取出return 0;
}

通过观察我们可以发现,用整形的方式存储和用浮点型的形式存储,拿出来的结果不同。

由此,我们可以大胆推测,整形和浮点型在内存中的存储方式不同。

那浮点型在内存中究竟是怎么存储的呢?

1.2 浮点数存储规则

根据国际标准IEEE(电气和电子工程协会) 754,

任意一个二进制浮点数V可以表示成下面的形式:

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

举一个简单的例子:

十进制的 5.0

先转换成二进制:101.0

写成浮点数的形式:(-1)^0 * 1.01 * 2^2

相当于:S=0 , M=1.01 , E=2

那浮点数又是怎么存到内存里面的呢?

IEEE 754规定:

对于32位的浮点数,最高的1位是符号位s,

接着的8位是指数E,剩下的23位为有效数字M。

对于64位的浮点数,最高的1位是符号位S,

接着的11位是指数E,剩下的52位为有效数字M。

并且,规定中还有一些特殊的规则:

E是一个无符号整数,

这意味着当E为8位时,取值在1~255,

当E为11位时,取值在0~2047,

但是在实例中,E有可能为负数,所以,

IEEE 754规定,存入内存时E的真实值必须再加上一个中间数

单精度时加127,双精度时加1023

当然,规则总是说不完的,我们直接上实例:

1.3实践举例

我们通过刚刚学的存储方式,直接对一开始的那段代码进行分析:

#include <stdio.h>int main()
{int n = 9;//以整形的形式存储//补码 - 00000000000000000000000000001001//转换形式//用浮点型的形式取出//0 00000000 00000000000000000001001//(-1)^0 * 0.00000000000000000001001 * 2^-126//0.000000float* pFloat = (float*)&n;//强制类型转换成浮点数的指针printf("n的值为:%d\n", n);//以整形的形式取出//没有变化,打印 9printf("*pFloat的值为:%f\n", *pFloat);//以浮点数的形式取出//打印 0.000000*pFloat = 9.0;//以浮点数的形式存储//9.0//二进制 - 1001.0//(-1)^0 * 1.001 * 2^3//s=0, e=3, m=1.001//补码 - 01000001000100000000000000000000printf("num的值为:%d\n", n);//以整形的形式取出//打印 1091567616printf("*pFloat的值为:%f\n", *pFloat);//以浮点数的形式取出//打印 9.000000return 0;
}

这就是浮点型在内存中的存储。

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。


http://www.ppmy.cn/news/9854.html

相关文章

【寒假每日一题】AcWing 4652. 纸张尺寸

目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 一、题目 1、原题链接 4652. 纸张尺寸 - AcWing题库 2、题目描述 在 ISO 国际标准中定义了 A0纸张的大小为 1189mm841mm&#xff0c;将 A0纸沿长边对折后为 A1 纸&#xff…

Dropzone4 for MAC 文件拖拽增强工具

前言 ​​Dropzone for mac是一款文件拖拽操作增强工具&#xff0c;可以让我们把大部分工作都通过拖拽来完成&#xff0c;只需将文件拖拽到菜单栏上的窗口即可。比如保存文本、发送邮件、FTP上传、打开应用等等。提高了用户的工作效率。 下载 Dropzone4 特征 -打开应用程序…

【C语言进阶】指针进阶-回调函数

作者:匿名者Unit 目录一.函数指针数组1.定义2.转移表二.回调函数1.定义2.qsort的使用3.冒泡模拟实现qsort一.函数指针数组 1.定义 在之前我们已经了解过了函数指针: int(*p)(int,int)&add;我们还可以将函数的地址存放在数组&#xff0c;也就是函数指针数组 int (*p[10…

逻辑漏洞渗透与攻防(四)之任意账号注册

目录 任意账号注册 未验证邮箱/手机号 批量注册 个人信息伪造 前端验证审核绕过 邮箱/手机号注册激活验证绕过 用户名覆盖 任意账号注册 未验证邮箱/手机号 未验证邮箱/手机号&#xff0c;目前很多应用为了方便用户记录自己的用户名与密码&#xff0c;都可以使用邮箱…

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第三篇】(持续更新中)

在第二篇我们主要学习了路径别名&#xff0c;配置.env环境变量&#xff0c;封装axios请求&#xff0c;以及使用api获取数据后渲染 Element Plus表格 本期需要掌握的知识如下: 封装列表模糊查询组件实现新增 编辑 删除 模糊查询 重置 功能实现表单校验功能实现组件间传值 下期…

【vue2】基础概念 01 (vue框架介绍、el、data、插值表达式)

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;vue框架介绍、结构元素详解&#xff08;el、data、插值表达式&#xff09; 目录&#xf…

Python爬虫 xpath解析基础

今天继续给大家介绍Python爬虫相关知识&#xff0c;本文主要内容是Python爬虫 xpath解析基础。 一、xpath简介 xpath&#xff0c;即XML Path Language&#xff0c;是一种用来确定XML文档中某部分位置的语言&#xff0c;Xpath以XML为基础&#xff0c;可以提供用户在数据结构树…

SQL -- MySQL 初识

SQL SQL的概述&#xff1a; SQL全称&#xff1a; Structured Query Language&#xff0c;是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。 SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统System上实现美国国家…