C 语言浮点数的二进制表示
1.
前几天,我在读一本 C 语言教材,有一道例题:
#include <stdio.h>
void main(void){
int num=9; /* num 是整型变量,设为 9 */
oat* pFloat=# /* pFloat 表示 num 的内存地址,但是设为浮点数 */
printf("num 的值为:%d",num); /* 显示 num 的整型值 */
printf("*pFloat 的值为:%f",*pFloat); /* 显示 num 的浮点值 */
*pFloat=9.0; /* 将 num 的值改为浮点数 */
printf("num 的值为:%d",num); /* 显示 num 的整型值 */
printf("*pFloat 的值为:%f",*pFloat); /* 显示 num 的浮点值 */
}
运行结果如下:
num 的值为:9
*pFloat 的值为:0.000000
num 的值为:1091567616
*pFloat 的值为:9.000000
我很惊讶,num 和*pFloat 在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别
这么大?
要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。我读了一些资料,下面就是我
的笔记。
2.
在讨论浮点数之前,先看一下整数在计算机内部是怎样表示的。
int num=9;
上面这条命令,声明了一个整数变量,类型为 int,值为 9(二进制写法为 1001)。普通的 32
位计算机,用 4 个字节表示 int 变量,所以 9 就被保存为 00000000 00000000 00000000
00001001,写成 16 进制就是 0x00000009。
那么,我们的问题就简化成:为什么 0x00000009 还原成浮点数,就成了 0.000000?
3.
根据国际标准 IEEE 754,任意一个二进制浮点数 V 可以表示成下面的形式:
V = (-1)^s×M×2^E
(1)(-1)^s 表示符号位,当 s=0,V 为正数;当 s=1,V 为负数。
(2)M 表示有效数字,大于等于 1,小于 2。
(3)2^E 表示指数位。
举例来说,十进制的 5.0,写成二进制是 101.0,相当于 1.01×2^2。那么,按照上面 V 的格
式,可以得出 s=0,M=1.01,E=2。
十进制的-5.0,写成二进制是-101.0,相当于-1.01×2^2。那么,s=1,M=1.01,E=2。
IEEE 754 规定,对于 32 位的浮点数,最高的 1 位是符号位 s,接着的 8 位是指数 E,剩下的
23 位为有效数字 M。
评论2
最新资源