首页
社区
课程
招聘
[原创]double类型数据存储结构
2007-11-20 20:58 9991

[原创]double类型数据存储结构

2007-11-20 20:58
9991
我们知道任何一个数都可以按科学计数法表示成A×10的B次方的形式,其中1.0≤A<10,B为整数。同样的道理,也可以表示成C×010的D次方的形式,其中010表示2的二进制表示,C为二进制浮点数,D为二进制整数。例如5.0用二进制表示就是0101,也就是可以表示成(1.01)×010的2次方的形式。知道了这点,我们来看一下在VC里面是怎样来存储double型数据的。
在VC里面,double型数据占据了8个字节,共64位。
最高位是符号位,0表示正,1表示负。
接下来的11位表示指数,用移码表示,关系为:11位数组成的值(无符号)-1023=指数,如上所示5.0的指数部分是2,11位数组成的值应该是1025,即100 0000 0001
余下的52位是小数位,其中1.0……中的1是默认的,没有占据位数。5.0的小数部位是1.01,则它的小数位在内存中应该表示成0100 0000 0000 ……0000(共52位)
所以+5.0在内存中存储的形式应该是0100 0000 0001 0100 0000 …… 0000即0x40140000 00000000。
下面我们通过一个程序来验证一下:
#include "stdafx.h"
#include "iostream.h"

typedef union tagOct
{
        double dData;
        int nData[2];
}Oct;

int main(int argc, char* argv[])
{
        Oct a;
        a.nData[0]=0;
        a.nData[1]=0x40140000;
        cout<<a.dData<<endl;
        return 0;
}
相信这段代码很好理解,先通过整形数组给共用体赋值,再以浮点的形式输出,最后的结果果然是5。如果把0x40140000改成0xC0140000呢,相信你很快就得到答案,是-5,不相信?去试试吧。
附:float型和double型基本一样,只是它用8位表示指数,用23位表示小数,另外它的移码表示不是相差1023(2的10次方-1),而是127(2的7次方-1)。有兴趣可以试验一下。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (5)
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
要学会编 2007-11-20 21:24
2
0
学习了.  楼主贴个反汇编代码段啊 更直观.
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
scor 2007-11-20 21:48
3
0
嗯,刚正用VC编程序,就用那个写了。
雪    币: 437
活跃值: (253)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
bzhkl 5 2007-11-20 22:41
4
0
MARK 下
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
scor 2007-11-21 16:20
5
0
不错啊,回去试试。
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 26 2007-11-24 22:59
6
0
不错,帮顶
游客
登录 | 注册 方可回帖
返回