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);
运行结果为:
有输出结果可知,当整型数据以浮点型取出时或浮点型数据以整型取出时,其结果与预期的结果差异很大,这就说明浮点型数据和整型数据在内存中的存储形式是不同的。下面介绍浮点型数据在内存中如何存储:
1.先将实数转化为二进制的形式;
2.任何二进制形式的实数均可写成 Q = (-1)^S * M * 10^E 的形式(科学计数法):
(1) (-1)^S表示符号位,S=0为负,S=1为正;
(2) M的取值范围规定是[1,2),而计算机内部保存M时,因为M的第一位总是1,为提高精度可将1舍去,只存储小数部分(存储时低位补0),等到读取时再把1加上去;
(3) E存储为无符号整数(unsigned int) ,为保证内存中的E始终大于0,需要给公式中的E加上一个中间值(float类型+127,double类型+1023) ,再以二进制形式存储。
E在取出时又分为以下两种特殊情况:
(1) E在内存中全为0: 此时内存中M取出时不再加上第一位的1,而是还原为0.xxxxxx的小数(表示接近零很小的数字);
(2) E在内存中全为1: 此时如果内存中M全为0,表示正负无穷大;
以5.5为例,其在内存的存储(float类型):
5.5(10) = 101.1(2) = (-1)^0*1.011*2^2(2) 故 S = 0; M = 1.011; E = 2;
存储为:0 10000001 01100000000000000000000
感谢大家的支持哦~我会继续努力的