整形在内存中是以二进制补码形式存储的,浮点数呢?
浮点数先化成 (-1)^S * M * 2^E 这种形式 ,比如:5.5
将转换好的二进制小数,用科学计数法表示,5.5可以写为:1.011*2^2
套入上面公式:S 表示符号位,正数为0,负数为1;
S=0 , M=1.011 ,E=2 ;
单精度浮点类型占四个字节(32bit),双精度浮点类型占八个字节(64bit)如下图分布:
注意:E加上中间值要用二进制表示;M再取出时一定要加上前面去掉的1.
取出浮点数时:
E全为0时 这时,浮点数是指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示正负0,以及接近于0的很小的数字。
E全为1时 这时,如果有效数字M全为零,表示正负无穷大(正负取决于s);
例题:
#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("n的值为:%d\n", n);
printf("*pFloat的值为:%f\n", *pFloat);
return 0;
}
会打印什么呢?
int main()
{
int n = 9;
//0 00000000 00000000000000000001001
//E为全0
//E直接就是1-127 = -126
//M = 0.00000000000000000001001
//0.00000000000000000001001 * 2^-126
//
float* pFloat = (float*)&n;
printf("n的值为:%d\n", n);//9
printf("*pFloat的值为:%f\n", *pFloat);//0.000000
*pFloat = 9.0;
//1001.0
//(-1)^0 * 1.001*2^3
//S=0
//E = 3
//M = 1.001
//01000001000100000000000000000000
printf("n的值为:%d\n", n);//1091567616
printf("*pFloat的值为:%f\n", *pFloat);//9.000000
return 0;
}