文章目录
前言
浮点数转换为二进制形式
浮点数在内存中的存储规则
-
(-1)^S * M * 2^E
-
(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
-
M表示有效数字,大于等于1,小于2。
-
2^E表示指数位。
有效数字 M的存储规定
指数E的存储规定
案例分析
案列
int n = 9;
float* p = &n;
printf("n = %d\n", n);
printf("*p = %f\n", *p);
*p = 9.0;
printf("n = %d\n", n);
printf("*p = %f\n", *P);
但当我们了解了浮点数在内存中的存储规则的时候,我们就回发现其实并不是这样。实际上的程序运行结果其实是:
原因
9 -> 0000 0000 0000 0000 0000 0000 0000 1001
V=(-1)^0 × 0.00000000000000000001001×2^(-126) = 1.001×2^(-146)
9.0 -> 1001.0 ->(-1)^01.0012^3 -> s=0, M=1.001,E=3+127=130
那么,第一位的符号位s=0,有效数字M等于001后面再加20个0,凑满23位,指数E等于3+127=130,即10000010。所以,写成二进制形式,应该是s+E+M,即
0 10000010 001 0000 0000 0000 0000 0000
这个32位的二进制数,还原成十进制,正是 1091567616 。