请问一个类型强制转换的问题??? ( 积分: 30 )

  • 主题发起人 主题发起人 gywlily
  • 开始时间 开始时间
G

gywlily

Unregistered / Unconfirmed
GUEST, unregistred user!
Taaa = (gr1, gr2, gr3);
Taaas = set of Taaa;
procedure TForm1.Button1Click(Sender: TObject);
var
a: Taaas;
i: integer;
begin
a := [gr1, gr2, gr3];
i := byte(a);
//showmessage(inttostr(i));
end;
为什么 i 的结果是 7 ?????????????
Delphi是怎么计算出来的?
谢谢
 
Taaa = (gr1, gr2, gr3);
Taaas = set of Taaa;
procedure TForm1.Button1Click(Sender: TObject);
var
a: Taaas;
i: integer;
begin
a := [gr1, gr2, gr3];
i := byte(a);
//showmessage(inttostr(i));
end;
为什么 i 的结果是 7 ?????????????
Delphi是怎么计算出来的?
谢谢
 
我刚才做个个小实验发现:
a=[gr1] 时 i=1
a=[gr2] 时 i=2
a=[gr3] 时 i=4
有点奇怪,i会不会是内存地址啊?
 
内存地址?? 不会吧.
i总是2的n次方!
 
Delphi是用这种方式存储集合变量的,把有序变量按顺序取2的n次方,
然后或(其实就是相加);
a := [gr1, gr2, gr3];就是
1 + 2 + 2*2 = 7
就是这个结果。
 
那么就是 2^0 + 2^1 + 2^2 + ....... ?????????????????
 
不信你实验[gr1,gr3],看结果是不是:
2^0 + 2^2 =5.
 
呵呵,我不是不相信,, 我只是不知道为什么Delphi会这样处理集合类型?
为什么要取2的n次方呢, 不理解!
 
这样对编译器显然是最方便的,你想一个2进制数,只要判断某位是否为1就可以知道该元素
是否存在了.
比如00011001,就只包含第0,3,4序数元素。
 
嗯,呵呵,有道理!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
724
import
I
后退
顶部