龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

浮点数的二进制表示

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
浮点数 是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的

浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。

前几天,我在读一本C语言教材,有一道例题:

  1. #include <stdio.h>  
  2. void main(void){  
  3. int num=9; /* num是整型变量,设为9 */ 
  4. float* pFloat=&num; /* pFloat表示num的内存地址,但是设为浮点数 */ 
  5. printf("num的值为:%d\n",num); /* 显示num的整型值 */ 
  6. printf("*pFloat的值为:%f\n",*pFloat); /* 显示num的浮点值 */ 
  7. *pFloat=9.0; /* 将num的值改为浮点数 */ 
  8. printf("num的值为:%d\n",num); /* 显示num的整型值 */ 
  9. printf("*pFloat的值为:%f\n",*pFloat); /* 显示num的浮点值 */ 

运行结果如下:

  1. num的值为:9  
  2. *pFloat的值为:0.000000  
  3. num的值为:1091567616  
  4. *pFloat的值为:9.000000 

我很惊讶,num和*pFloat在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大?

要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。我读了一些资料,下面就是我的笔记。

1、在讨论浮点数之前,先看一下整数在计算机内部是怎样表示的。

  1. int num=9; 

上面这条命令,声明了一个整数变量,类型为int,值为9(二进制写法为1001)。普通的32位计算机,用4个字节表示int变量,所以9就被保存为00000000 00000000 00000000 00001001,写成16进制就是0x00000009。

那么,我们的问题就简化成:为什么0x00000009还原成浮点数,就成了0.000000?

2、根据国际标准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。

【责任编辑:QiHappy TEL:(010)68476606】

精彩图集

赞助商链接