VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索

测一测:你对type类型在内存中的存放方式了解的程度有多深

2012-9-22 22:59| 发布者: sunfrank| 查看: 1654| 评论: 62|原作者: VBProFan

摘要: 地球人都知道,byte一字节,integer两字节,long四字节 如果: const a as byte=1 const b as integer=2 const c as long=3 那么他们在内存中的方式是这样的: a: 01 b: 02 00 c: 03 00 00 00 好,现在看来 ...
地球人都知道,byte一字节,integer两字节,long四字节
如果:
const a as byte=1
const b as integer=2
const c as long=3
那么他们在内存中的方式是这样的:
a: 01
b: 02 00
c: 03 00 00 00
好,现在看来好像没有问题是吗?那么请你猜一猜看:
如果有如下定义
Private Type test
  a As Byte
  b As Integer
  c As Long
  EndFlag As Byte
End Type

Sub main
  Dim MM As test
  MM.a = 1
  MM.b = 2
  MM.c = 3
  MM.EndFlag = 255
End Sub
那么a、b、c在内存中是怎样存放的?
你可以用如下函数验证你的想法:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal

Length As Long)
Public Function DumpMemory(ByVal Address As Long, ByVal Length As Long) As String
  Dim n As Byte
  Dim i As Byte
  Dim s As String
  
  s = ""
  For i = 1 To Length
    CopyMemory ByVal VarPtr(n), ByVal (Address + i - 1), 1
    s = s & (FLStr(Hex(n), 2)) & " "
  Next i
  DumpMemory = s
End Function
Public Function FLStr(ByVal s As String, ByVal L As Byte) As String
  If L <= Len(s) Then
    FLStr = s
  Else
    FLStr = String(L - Len(s), "0") & s
  End If
End Function

好,现在你若有所思,好像得到一个结论了,真的是这样吗?先别急,现在请你把结构定义改为:
Private Type test
  a As Long
  b As Integer
  c As Byte
  EndFlag As Byte
End Type
呵呵,现在是不是被我弄晕了,你再把a、b、c的类型byte、integer、long颠来倒去糊弄一轮后,最后会恍然大悟,发现一个

VB6的秘密,你发现了什么?请把它写出来!

[ 本帖最后由 VBProFan 于 2006-7-7 17:37 编辑 ]
发表评论

最新评论

引用 scjlbhx 2006-7-7 17:12
好帖!
偶等菜鸟恭侯下文.
引用 tanyong 2006-7-7 17:23
看不懂
引用 VBProFan 2006-7-7 17:30
呵呵,谢谢捧场,其实这个是我前段时间对某个较底层的API函数为何在VC中调用就成功,在VB就失败的研究中,绞尽脑汁才研究出来的,拿来与大家分享的。直接说出结论就没意思了,所以引导大家来一起研究
引用 CrCat 2006-7-7 17:57
有意思,但是怎么获得变量的地址阿…………
引用 VBProFan 2006-7-7 18:13
我不是在前面写了个Public Function DumpMemory函数吗?用VarPtr取地址,CopyMemory取内容
引用 ben1222 2006-7-7 18:28
啊...的确好奇怪啊...
'b表示byte,l表示long,i表示integer
'byte的那个我赋值&H88 integer的那个我赋值&H99AA long的那个我赋值&HBBCCDDEE
'最后的FF就是那个endflag
88 00 00 00 BB CC DD EE 99 AA FF 'bli
BB CC DD EE 99 AA 88 FF 'lib
88 00 99 AA BB CC DD EE FF 'bil
99 AA 00 00 BB CC DD EE 88 FF 'ilb
BB CC DD EE 88 00 99 AA FF 'lbi
99 AA 88 00 BB CC DD EE FF 'ibl
真...郁闷...想不出...这些00出现的规律...

[ 本帖最后由 ben1222 于 2006-7-7 18:37 编辑 ]
引用 CrCat 2006-7-7 18:47
题目中提到的两种方法的输出结果:
01 00 02 00 03 00 00 00 FF 00 00 00
01 00 00 00 02 00 03 FF
引用 CrCat 2006-7-7 18:48
当然,如果针对Test类型的任意一个变量读取信息则与一般变量的结果无二……
引用 CrCat 2006-7-7 19:02
我试了十几种组合,表面现象是这样的:如果定义类型均相同,则没有什么异样;如果定义类型不同,则会有影响,而且均是占位少的增位了,而没有Long-->Integer/Byte这种减位的现象……
引用 CrCat 2006-7-7 19:03
哇!!实在找不到规律了…………楼主给个提示吧……
引用 西门吹雪 2006-7-7 20:05
获得变量地址的还有一个StrPtr,获得一个对象变量的地址的还有一个ObjPtr.
引用 VBProFan 2006-7-7 20:17
呵呵,我提示一下吧
“如果定义类型均相同,则没有什么异样”这点非常正确
如果定义类型不同则有异样,但异样在哪呢?对,就是VB自动把某些类型给括展了,
Byte可能被扩展为Integer或Long,Integer则有可能被扩展为Long,但在什么情况下扩展,什么情况下不扩展呢?
现在还没有人猜出规律,再继续试验、观察,看看谁先发现!(呵呵,继续卖关子)
引用 superzmy 2006-7-7 20:34
long习惯摆在 4的整数倍位置上
int 习惯 在2字节倍数上
Byte 放在一个 2字节的空间里,两个byte会共同占用一个2字节空间……否则空一个字节?
……

[ 本帖最后由 superzmy 于 2006-7-7 20:36 编辑 ]
引用 VBProFan 2006-7-7 20:56
呵呵,比较接近了。好像比我总结的规律还要更深刻一点,我再研究一下先~
引用 VBProFan 2006-7-7 22:11
做过试验了,superzmy教授的猜测并不完全正确,int已经在4的整数倍位置上了。不过我也突
然明白VB编译器这样做的目的何在了。
引用 VBProFan 2006-7-7 22:12
继续提示。现在我把ben1222专家的实验结果重新排列一下
byte=2,integer=4,long=8,b<i<l

88 00 00 00   BB CC DD EE   99 AA         'bl     i
BB CC DD EE   99 AA         88            'l      i     b
88 00         99 AA         BB CC DD EE   'bil
99 AA 00 00   BB CC DD EE   88            'il     b
BB CC DD EE   88 00         99 AA         'l      bi
99 AA         88 00         BB CC DD EE   '(ib)    l

其中最后一条实验结果是出乎我意料之外的,如果按我原来总结的规律,
ibl的输出应该是:
99 AA 00 00     88 00 00 00   BB CC DD EE
看来这贴是发对了,在把自己研究所得告诉他人的同时,自己也得到了进步和提高啊~
引用 VBProFan 2006-7-8 09:45
啊...的确好奇怪啊...
'b表示byte,l表示long,i表示integer
'byte的那个我赋值&H88 integer的那个我赋值&H99AA long的那个我赋值&HBBCCDDEE
'最后的FF就是那个endflag
88 00 00 00 BB CC DD EE 99 AA FF 'bli
BB CC DD EE 99 AA 88 FF 'lib
88 00 99 AA BB CC DD EE FF 'bil
99 AA 00 00 BB CC DD EE 88 FF 'ilb
BB CC DD EE 88 00 99 AA FF 'lbi
99 AA 88 00 BB CC DD EE FF 'ibl
真...郁闷...想不出...这些00出现的规律...

实验好像有造假嫌疑:
Intel系列CPU的体系设计是低对低、高对高的。&HBBCCDDEE在内存中应该是
EE DD CC BB
引用 VBProFan 2006-7-8 09:46
提示:
数学家在研究复杂的问题时,先研究最简单的情况,发现规律,然后猜想,再过渡到复杂的情
况。著名的数学家华罗庚说:“先足够的退,退到能看清问题而又不失重要性的地方再上去……进而有退、退不忘进”。
物理学家在研究具有多个变量的系统中各变量的关系时先把其他量都固定不变,先研究两个变量之间的制约关系。

[ 本帖最后由 VBProFan 于 2006-7-8 09:50 编辑 ]
引用 VB爬虫 2006-7-8 09:52
研究研究

查看全部评论(62)

相关分类

文字版|手机版|小黑屋|VBGood  

GMT+8, 2021-4-13 23:31

VB爱好者乐园(VBGood)
返回顶部