remeke (remeke) · GitHubhttps://github.com/remeke今天继续学习了数据的存储内容。
浮点型数据的存储方式
#include<stdio.h>
#include<windows.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;
}
例如:9.0可以写成二进制1001.0,再化成(-1)^0*1.001*2^3
S-0,M-1.001,E-3
IEEE 754规定:对于32位(double类型)的浮点数,最高的一位是符号位S,接着的8位是指数E,剩下的23位为有效数字M
IEEE 754规定:对于64位(float类型)的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M
IEEE 754还有一些其他的规定
关于M:由于M的第一位总是1,因此可以被省去,只保留后面的小数部分,例如保存1.01的时候,只保存01,等到读取的时候再把第1位的1加上去,这样是为了节省1位有效数字,以double类型为例,等于可以保存24位有效数字。
关于E:由于E是1个无符号整数。如果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.
指数E从内存中取出还可以再分成三种形式
对于开头的题目的解释: