浮点型在内存中的存储
常见的浮点型:(小数)
float,double,long double类型,浮点数表示的范围:float.h中定义
整形家族:int,short,char的表示范围在 limits.h头文件中定义
浮点型家族:的表示范围在float.h头文件中定义
可以在头文件中查看他们表示的最大值和最小值。
int main()
{
int n=9; //四个字节
float*pFloat =(float *)&n; //(float *)强制类型转换
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.000000
1091567616
9.000000
什么原因导致的结果?
因为浮点型在内存中存储的方式来决定的。
浮点型和整形在内存中的存储方式,和取读方式都是有区别的。
整型的形式放进去,浮点型的形式取;
浮点型的形式放进去,整形的形式取。显然结果出现问题。
显而易见,两者有区别。
浮点数和整数在内存中存储的方式一定是有区别:
整数是以补码的二进制方式存进去,而且会有一个大小端的顺序问题。
浮点型在内存中的存储有IEEE 754规定,
-
根据国际标准 IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:
- (-1)^S M2 ^ E
-
(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。
M表示有效数字,大于等于1,小于2
2^E表示指数位
举例说明:
浮点数:5.5 (10进制)
二进制:101.1 将其表示为科学计数法 1.0112^2
(-1)^01.011*2 ^ 2
S=0,M=1.011,E=2
有了S,M,E我们就可以很好的还原浮点数。
IEEE 754规定:对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。