IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> [C语言学习] 数据的存储:浮点型在内存中的存储 -> 正文阅读

[C++知识库][C语言学习] 数据的存储:浮点型在内存中的存储

????????浮点型分为单精度浮点型(float)和双精度浮点型(double),二者的精确范围不一样,在计算机存储中各占4字节和8字节。

????????我们可以通过limits.hfloat.h这两个头文件查看浮点型的精度和范围。

????????要想弄清楚浮点型如何在内存中存储,以及float和double的区别。首先要明确以下几点。

????????1.小数的二进制表示法。????????如:十进制小数5.5 二进制表示为101.1

????????2.浮点型在计算机中存储遵循IEEE 754(二进制浮点数算术标准)

????????3.指数位决定取值范围,有效数字位决定计算精度

浮点数存储规则

? ? ? ? 1.根据IEEE754标准,两种浮点型的格式参数如下

符号位(S)指数(E)有效数字(M)总位数
单精度浮点型(flaot)1位8位23位32位
双精度浮点型(double)1位11位52位64位

???????????????符号位S与整型存储相同,1代表负数,0代表正数,不同的是,浮点型不存在原码,反? ? ? ? ????????? ?码,补码的概念

? ? ? ? ? ? ? ?对于指数E和有效数字M,我们知道,任意小数可以使用科学计数法表示:

???????????????如十进制小数0.00005=5×10??。同理,二进制小数101.1=1.011×22

? ? ? ? ? ? ? ?那么,根据IEEE754规定,1.011就代表有效数字M,22的指数2代表指数E。

格式参数的可视化形式:

? ? ? ? 2.对于M和E,还有一些特别规定。

?👉由于1≤M<2,即有效数字位可以写成1.xxxxxx的形式,那么我们可以把小数点前的1省略,只? ? ? ? 将小数点后的数字存进去。读取时,再将1加上去。这样做的目的是为了多存储一位有效数? ? ? ? ????字。

👉对与指数E。float留了8位,double留了15位,范围分别为0~255,0~2047。但在科学计数法? ? ? ? ?中,指数存在负数的情况。所以IEEE754规定,存入内存时,E的真实值必须再加上一个中间? ? ? ? ?数。float中间数为127,double的中间数为1023。

?????相当于舍弃了符号位,但还是可以保存-127~128或-1023~1024的真实值范围。

👉接上一条,E存在全0和全1两种特殊情况,

????????E全为0:有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示? ? ? ? ? ? ? ±0,以及接近于 0的很小的数字。

????????E全为1:这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)。

例:将十进制0.5的二进制存入内存。

? ? ? ? 首先转换为二进制0.1,科学计数法写成1.0×2?1,S=0,E=-1+127=126,M=0

? ? ? ? 有效数字23位要凑满,直接拿0凑

? ? ? ? 所以该数的二进制表示形式为:

????????0 01111110 00000000000000000000000

🔪最后来道练习题:

#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;
}

😁输出的结果是什么呢?

解释:

????????创建一个整型变量n=9,首先取地址转换成float*类型再放到指针变量pFloat中,这两步并没有改变n的值,所以n的值依然为9。

? ? ? ? 对pFloat进行解引用,由于之前9以整型存进去,所以n内存的是二进制00000000000000000000000000001000,而pFloat是float*类型,以%f形式打印,所以要以浮点型的视角来看,那么E全为0,最终结果就是0。

? ? ? ? 将9.0赋给*pFloat,9.0的二进制科学计数法为1.001×23那么,S=0,E=3+127=130,M=001,M后面要拿0凑满,所以*pFloat为0 10000010 00100000000000000000000,又将其以%d的形式打印,也就是整型的视角来看这串二进制,内存中整型存的补码,正数原反补相同,通过计算器算出

?与运行结果一致。

? ? ? ? 最后将其以%f的形式打印,类型一致,那么就打印9.000000。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 09:43:57  更:2021-11-27 09:43:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:00:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码