浮点型数据分为float(单精度)和double(双精度)、long double三种。
在32位平台下,单精度型占4个字节,双精度类型占8个字节。
那么浮点型在内存中又是以什么样的形式存储和读取呢?下面就以float型为例进行讲解。
首先,我们先回顾一下数学上对科学计数法的规定。
如:1034 用科学计数法可写成1.034x10^3。
可见,科学计数法规定有效数字的范围为(i>=1&&i<10),而10^3实际上是将小数点向右移动三位。
同理,浮点型在内存中的存储类似于科学计数法。
//int a=10的二进制为0000 0000 0000 0000 0000 0000 0000 1010
//float a=10.0的二进制为1.010*2^3
//根据国际标准规定:float存储时满足以下公式:(-1)^S*M*2^E
//1.(-1)^S表示符号位,当S=0时,数据为正数;S=1时,数据为负数;
//2.M代表有效数字,范围为(i>=1&&i<2);
//3.2^E代表指数位。
//由float a=10.0的二进制可得出S=0,M=1.010,E=3。
//国际规定,对于32位的浮点数在内存中存储,最高位为符号位(S),接着八位为指数位(E),剩下的为有效数位(M).
但在存储时对E、M有其他规定。
练习题:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n = 9;
float *pFloat = (float*)&n;
printf("n的值为:%d\n", n);
printf("pFloat的值为:%f\n", *pFloat);
*pFloat = 9.0;
printf("n的值为:%d\n", n);
printf("pFloat的值为:%f\n", *pFloat);
system("pause");
return 0;
}
结果:
分析: