冰冰学习笔记:数据的存储(3)---浮点数的储存方式

博客详细解释了浮点数和整数在内存中的存储方式,依据IEEE 754标准,阐述了浮点数的符号位、指数位和有效数字的存储规则,并通过实例说明了读取和存储时的转换过程,同时讨论了整数到浮点数转换可能带来的结果变化。
摘要由CSDN通过智能技术生成

先看一道练习题:

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,

定义一个浮点数指针用来存放n的地址,n的地址应为int*类型,所以强制类型转换为float*类型

以%d形式(整形方式)打印n

以%f形式(浮点数形式)打印n

对其指针进行解引用,将n变为9.0

继续

以%d形式(整形方式)打印n

以%f形式(浮点数形式)打印n

简单来说代码分别用整形和浮点型的方式对其进行赋值,然后再以整形和浮点数类型分别拿出来

那结果会是什么呢?

9,9.0,9,9.0???

均不是,结果是:

为什么呢?

因为浮点数和整数的存储方式在内存中完全不同!!! 

浮点数在内存中的存储:

1.1浮点数家族包括:

float

double

long double

浮点数表示的数据范围在float.h中定义

那浮点数是怎么储存的呢?

1.2储存规则

国际标准IEEE(电气和电子工程协会)754规定,任意一个二进制浮点数F都可以表示成下面的形式:

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

(-1)^S:表示符号位,当S=0,F为正数,S=1,F为负数

M:表示有效数字,大于等于1,小于2.

2^E:表示指数位

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

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

 由于M写成科学计数法,必定为1.xxxxx的形式,其中xxxxx为小数部分,

所以标准规定,M在存储的时候只保留小数部分,也就是xxxxx部分,比如5.5

二进制为101.1,写成科学计数法M为1.011,在保存的时候将会舍弃掉1,只保留011.

在读取的时候再把第一位的1加上,如此做可以节省一位有效数字,精度将会提高。

指数E在存储中定义为一个无符号整数

这意味着,如果 E 8 位,它的取值范围为 0~255 ;如果 E 11 位,它的取值范围为 0~2047
但是并不意味着E没有负值。
当存储0.5时
二进制为0.1,写成科学计数法则为1.0*2^-1
此时E为-1,但是E为无符号数呀,这怎么办呢?
标准规定:
存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E
这个中间数是1023

也就是说在存储5.5时,E=2,但是在存储中8个比特位并不是存储的00000010

而是存储的E+127也就是说存储的为2+127=129,转化为2进制为 10000001

M实际存储为011,不够23个比特位,补0 

所以5.5在内存中的储存为:

在这说了大半天,到底是不是呢?

我们验证一下

内存中确实是这样存储的

1.3读取规则:

在读取的时候要特别注意E的读取

E不全为0或不全为1

指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
比如0.5存储时,E为-1,实际在内存中存储的是E+127=126,二进制:01111110
所以0.5的二进制存储为:
0 01111110 00000000000000000000000
将其读取出来时:
反向计算,S和M和存储时一样,都是0.
E为01111110为126,需要减去127,所以E为-1
E全为0

浮点数的指数E等于1-127(或者1-1023)即为真实值,

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

E全为1

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

接下来我们再次分析开篇的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bingbing~bang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值