当前位置:网站首页>浮点型数据在内存中如何存储

浮点型数据在内存中如何存储

2022-07-28 05:26:00 JuLiJuLi.

       要想理解浮点型数据如何存储,一定要搞懂浮点数在计算机内部的表示方法。
(1).根据国际IEEE 754标准 任意一个二级制浮点数v可以转换为以下形式
(-1)^S * M * 2^E
(-1)^s表示符号位,当s=0V是正数,当s=1V是负数。
M则表示有效数字,M的取值范围是大于等于1,小于2,因为二进制的数据存储不会超过2。
2^E则表示指数位。
(2).举个例子来说明
十进制的5.0,转换为二进制是101.0,相当于1.01*2^2
如果转换为上面v的格式 ,可以得出s=0; M=1.01;E=2,
V=(-1)^0*1.01*2^2
如果是十进制的-5.0,根据上面可以得出二进制是-101.0,相当于-1.01*2^2
那么S=1;M=1.01;E=2,
V=(-1)^1*-1.01*2^2
(3).根据国际IEEE 754标准,我们可以得知:
对于32位的单精度浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位则为有效数字M。
对于64位的双精度浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位则为有效数字M
(4).IEEE 754标准对于有效数字M有一个规定,上面说过M的取值范围是1≤M<2,也就是说M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分,IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的小数部分。

(5)对于指数E也有规定,E如果是一个无符号整数,假设E8位,它的取值范围为0~255;如果E11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所IEEE 754中规定,存入内存时E的真实值必须再加上一个中间数,

对于8位的E,这个中间数127;对于11位的E,这个中间数是1023

举例:2^10E10,所以保存成32位浮点数时,必须10+127=137,即10001001。

(6).当指数E从内存中取出时也有以下三种情况

1.当指数E不为全0或者不为全1时

整型转换为浮点型时指数E的真实值是:E的计算值-127(或者1023)

举例:0.5的二进制形式是0.1,由于规定正数部分必须为1,小数点右移1位,则为 1.0*2^(-1),指数E为-1+127,表示为01111110,而尾数1.0去掉整数部分为0,补齐剩余0~23位:

0 01111110 00000000000000000000000
2.当指数E全为0时
指数E=1-127 (或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数,得到的真实值接近于0。
(3)指数E为全1时
如果有效数字M全为0,真实值表示±无穷大(正负取决于符号位s)。
#include<stdio.h>
int main()
{
	int li = 9;
	float* flag = (float*)&li;
	printf("n的值是:%d\n", li);      //9
	printf("flag的值是:%f\n", *flag);//0.000000
	//首先将整形9转换为浮点型,得到0 00000000 00000000000000000001001拆分,
	//可以得到第一位符号位S=0,后面接着的八位的指数E=00000000,剩余23位的有效位数字M=000 0000 0000 0000 0000 1001
	//V=(-1)^0*0.00000000000000000001001×2^(-126)=1.001×2^(-146)
	//S=0,E=00000000就是-126,M=000 0000 0000 0000 0000 1001
	//V是一个接近于0的正数,所以十进制小数表示是:0.00000000
	*flag = 9.0;
	printf("n的值是:%d\n", li);      //1091567616
	//V=(-1)^0*1.001*2^3
	//S=0,E=3+127,M=1.001
	//0 10000010 001 0000 0000 0000 0000 0000
	//V=1091567616 这个32位的二进制数,还原成十进制,就是 1091567616
	printf("flag的值是:%f\n", *flag);//9.000000
	return 0;
}

原网站

版权声明
本文为[JuLiJuLi.]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_64918556/article/details/123556447