首页
社区
课程
招聘
[讨论]VB的DOUBLE类型数据的存储格式
发表于: 2011-3-31 19:20 6883

[讨论]VB的DOUBLE类型数据的存储格式

2011-3-31 19:20
6883
我碰到一段程序,其中有关VB的DOUBLE类型数据的存储格式,不明白,特请教。
其中的一些数据类型的解读是参考了http://bbs.pediy.com/showthread.php?t=2359的帖子。

0040FE6F        .  8D4D 84             lea ecx,dword ptr ss:[ebp-7C]                  ;  
0040FE72        .  51                  push ecx
ecx=0012F9EC
d ecx查看:
0012F9EC  08 00 12 00 0D 94 49 73 8C 8F 15 00 08 00 00 00  鐍獉辌.
再d 00158F8C查看:
00158F8C  30 00 00 00 31 00 36 00 32 00 34 00 00 00 37 00  0.1624.7
代表的是ASCII '0'

0040FE73        .  8D95 48FDFFFF       lea edx,dword ptr ss:[ebp-2B8]                 ;  edx=0012F7B0[+8]=1
0040FE79        .  52                  push edx
edx=0012F7B0
d edx:
0012F7B0  02 00 00 00 3C C2 D2 77 01 00 00 00 40 01 05 00  .숼矒.ŀ
代表INTEGER类型的数字1

0040FE7A        .  8D85 ECFDFFFF       lea eax,dword ptr ss:[ebp-214]                 ;  eax=0012F854
0040FE80        .  50                  push eax                                       ;  存放结果的地方
d eax:
0012F854   00 00 00 00 80 08 00 00 01 00 00 00 00 00 1C 40  ..ࢀ...䀜

0040FE81        .  FF15 90114000       call dword ptr ds:[<&msvbvm60.__vbaVarAdd>]    ;  msvbvm60.__vbaVarAdd
d eax:
0012F854   05 00 00 00 80 08 00 00 00 00 00 00 00 00 F0 3F  .ࢀ....㿰
05代表Double类型,但是后面的00 00 00 00 00 00 F0 3F怎么解读??同时ECX的值也变成3FF00000.

再看下面的代码:
0040FE87        .  50                  push eax                                       ;  
0040FE88        .  FF15 88114000       call dword ptr ds:[<&msvbvm60.__vbaI4Var>]     ;  msvbvm60.__vbaI4Var
eax=00000001
结果是对的。

请哪位高手对VB的DOUBLE类型数据的存储格式解读一下?谢谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
双精度的是保存为浮点数据型的吧,猜想。
2011-3-31 21:06
0
雪    币: 73
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
楼上说得很对。就是保存成浮点类型的。我已经查到了相关资料,并可以解读DOUBLE类型的内存存储格式了。

浮点数的存储格式在IEEE 754标准中规定的,由IEEE(Institute of Electrical and Electronics Engineers)美国电气及电子工程师学会制定。标准名称叫做:二进制浮点数算术标准。由于涉及的内容较多,我就本例中的格式进行介绍。

二进制浮点数是以符号数值表示法格式储存,将最高效位元指定为符号位元(sign bit);“指数部份”,即次高效的e位元,为浮点数中,经指数偏差(exponent bias)处理过后的指数;“小数部份”,即剩下的f位元,为有效位数(significand)减掉有效位数本身的最高效位元。 如下图所示:

  +-+--------+-----------------------+
  |S|  Exp   |  Fraction             |
  +-+--------+-----------------------+

再具体到64位双精度,规定是这个样子的:

  S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
  0 1        11 12                                                63

算法是:

If E=2047 and F is nonzero, then V=NaN ("Not a number")
If E=2047 and F is zero and S is 1, then V=-Infinity
If E=2047 and F is zero and S is 0, then V=Infinity
If 0<E<2047 then V=(-1)**S * 2 ** (E-1023) * (1.F) where "1.F" is intended to represent the binary number created by prefixing F with an implicit leading 1 and a binary point.
If E=0 and F is nonzero, then V=(-1)**S * 2 ** (-1022) * (0.F) These are "unnormalized" values.
If E=0 and F is zero and S is 1, then V=-0
If E=0 and F is zero and S is 0, then V=0

在本例中,再看看里头的数据:
0012F854   05 00 00 00 80 08 00 00 00 00 00 00 00 00 F0 3F  

05表示DOUBLE类型,那么最后8个字节  00 00 00 00 00 00 F0 3F就是具体的数字了, 十六进制的表示就是3FF0000000000000,转成二进制形式就是:

00111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000

S=0,E=01111111111(十进制:1023) F=后面的全0
符合0<E<2047 的情况
那么结果就是 (-1)**S * 2 ** (E-1023) * (1.F)=(-1)**0 * 2 ** (1023-1023) * (1.0)=1.0,转换成整数就是:1。

更深入的阅读请看:
http://zh.wikipedia.org/wiki/IEEE_754#64.E4.BD.8D.E9.9B.99.E7.B2.BE.E5.BA.A6
http://www.psc.edu/general/software/packages/ieee/ieee.php
http://cuiyingfeng.blog.51cto.com/43841/6669/
2011-4-1 12:01
0
游客
登录 | 注册 方可回帖
返回
//