浮点数在内存中以该形式进行存储;例如:【二进制】;
所以在内存中只用存储S、M、E三个变量;
存储M时:M的形式总是为为1.xxxxxx;所以节省空间存储时舍掉1,只存储小数部分,计算时再加上;
存储 E时:E为一个无符号整型,始终存储一个正整数 ;为了使E以正整数形式存入,对于8位的E,存储时加上中间数127;对于11位,加上中间数1023;
(以全0为例) | S | E | M |
单精度浮点数存储(32位、4字节) 0 00000000 00000000000000000000000 | 1bit | 8bit | 23bit |
双精度浮点数存储(64位、8字节) 0 00000000000 00000000000000000000000 00000000000000000000000000000 | 1bit | 11bit | 52bit |
浮点数整个在内存中存储的过程: (以下为例)
int main()
{
float f = 5.5;//32位,4个字节
return 0;
}
//5.5
//101.1 (转换成二进制)
//S=0; E=2; M=1.011
//0 2+127 011
//0 10000001 01100000000000000000000
//0100 0000 1011 00000000000000000000
// 0x 40 b0 00 00 (转换为十六进制)
注:
当将存入内存中的浮点数取出时,分为三种情况:
(1)E不为全0也不为全1
按照存储的方式反向计算得到原浮点数。
(2)E为全0
V= -(1)^S*E^(-127)*1.xxxxxx,接近0。
(3)E为全1
V= -(1)^S*E^(127)*1.xxxxxx,无穷大。
思考:当一个整型变量以浮点型打印,或者一个浮点型变量以整型打印,会发生什么?
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;
}
/*输出结果:
n的值为:9
*pFloat的值为:0.000000
num的值为:1091567616
* pFloat的值为:9.000000
*/
此时,我们发现当打印类型与变量类型不符时,会输出一个毫不相关的数。事实上,整型变量是将其转换为二进制数存储在内存中,而浮点型是将公式 中的S、M、E以二进制的形式存储在内存中,如果将一个整型变量以浮点型打印,那么就会把整型存储的二进制补码翻译成浮点型公式打印,整型打印浮点型亦然,这种方法是不可取的,在此之前必须对变量进行强制类型转换。