0
点赞
收藏
分享

微信扫一扫

某网站获取到正文内容

往复随安_5bb5 2023-10-16 阅读 19

文章目录

3. 浮点型在内存中的存储

常见的浮点数:

3.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;
}

输出的结果是什么呢?
浮点数存储的例子
通过输出的结果,我们可以得知:一个数以整型的形式放进去,再以整型或浮点型的形式拿出来,结果是不一样的;一个数以浮点型的形式放进去,再以整型或浮点型的形式拿出来,结果也是不一样的。因此,我们可以推出:整型和浮点型在内存中的存储方式是有差异的!

3.2 浮点数存储规则

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

浮点数的表示形式

IEEE 754规定:
对于32位的浮点数,最高的1位符号位S,接着的8位指数E,剩下的23位有效数字M
单精度浮点数存储模型

对于64位的浮点数,最高的1位符号位S,接着的11位指数E,剩下的52位有效数字M
双精度浮点数存储模型

IEEE 754对有效数字M和指数E,还有一些特别规定:
前面说过,1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。

至于指数E,情况就比较复杂:
首先,E为一个无符号整数(unsigned int)。这意味着,如果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。

int main()
{
	float f = 5.5;
	//101.1
	//1.011 * 2^2
	//(-1)^0 * 1.011 * 2^2
	//S = 0
	//M = 1.011
	//E = 2
	//01000000101100000000000000000000
	//0x40b00000
	return 0;
}

然后,指数E从内存中取出还可以再分成三种情况:
E不全为0或不全为1

E全为0

E全为1


通过以上讲解,我们就可以解释一开始的代码了:

#include <stdio.h>

int main()
{
	int n = 9;
	//00000000000000000000000000001001
	float* pFloat = (float*)&n;
	
	printf("n的值为:%d\n", n);//9
	printf("*pFloat的值为:%f\n", *pFloat);//0.000000
	//0 00000000 00000000000000000001001
	//S E        M
	//E在内存中是全0
	//0 -126     0.00000000000000000001001
	//(-1)^0 * 0.00000000000000000001001 * 2^-126
	
	*pFloat = 9.0;
	//1001.0
	///1.001 * 2^3
	//(-1)^0 * 1.001 * 2^3
	//S=0      M=1.001   E=3
	//01000001000100000000000000000000
	printf("num的值为:%d\n", n);//1091567616
	printf("*pFloat的值为:%f\n", *pFloat);//9.000000

	return 0;
}
举报

相关推荐

0 条评论