變體結構也就是變體記錄, 是乙個比較複雜的概念. 專家不提倡使用.
興趣所致, 我想把它弄明白.
乙個最大的無符號整數(cardinal)是 4294967295, 它的大小是 4 位元組, 它的二進位制表示是:
11111111 11111111 11111111 11111111
它的低位元組的值是 11111111, 也就是十進位制的 255
//測試:乙個 byte 型別的最大值是 255, 它的大小是 1 個位元組, 用二進位制表示是:var c: cardinal;
begin
c := 4294967295;
showmessage(inttostr(lo(c)));
end;
11111111
假如把乙個 cardinal 型別的值賦給乙個 byte 型別的值, byte 將只取 cardinal 的最低位元組.
//測試:這是我們能否會想到, 在結構會儲存時, 乙個可以儲存 cardinal 的空間, 當然也能得放下乙個 byte 值;var c: cardinal;
b: byte;
begin
c := 4294967295;
b := c;
showmessage(inttostr(b));
c := 258;
b := c;
showmessage(inttostr(b));
end;
如果這個值非此即彼, 我們完全不需要兩個儲存空間.
我猜測, 這應該是 delphi 設計變體記錄的初衷.
//假如有這樣乙個員工登記表本話題暫時到這吧. 另參見:type
tpersonrec = record
id: integer;
case boolean of
true: (a: cardinal);
false: (b: word);
end;
var personrec: tpersonrec;
begin
showmessage(inttostr(sizeof(tpersonrec)));
//賦值測試:
personrec.id := 110;
personrec.a := 100000;
//取值:
showmessage(inttostr(personrec.a));
//但是:
showmessage(inttostr(personrec.b));
end;
type
tpersonrec = record
id: integer;
case tag: boolean of
true: (a: cardinal);
false: (b: word);
end;
var personrec: tpersonrec;
begin
personrec.id := 110;
personrec.tag := true;
personrec.a := 100000;
personrec.id := 111;
personrec.tag := false;
personrec.b := 100;
end;
//最經典的變體結構莫過於 delphi 定義的 tmessage 結構了, 兩組資料分分合合都是一體, 多麼巧妙啊!
tmessage = packed record
msg: cardinal;
case integer of
0: (
wparam: longint;
lparam: longint;
result: longint);
1: (
wparamlo: word;
wparamhi: word;
lparamlo: word;
lparamhi: word;
resultlo: word;
resulthi: word);
end;
再說變體結構
再說變體結構 回覆 彬 的問題
假如有這樣三種結構,分別來描述 直線 圓與三角形 type tline packed record id integer x1,y1 integer x2,y2 integer end tcircle packed record id integer x,y integer r integer en...
學習記錄 python選擇結構7 15
在 控制結構 控制程式執行的邏輯結構 順序結構 逐行執行,每句 執行且執行一次 選擇結構 根據條件判斷,決定哪些 執行,哪些不執行 迴圈結構 重複執行 if else結構 money 120 if money 100 print 買寶馬!print 明天就提車!else 條件為假的時候執行的內容 否...
學習記錄 python迴圈結構7 15
迴圈結構 重複執行 for i in range 10 print hello world range a,b,c 生成乙個a b之間的序列,步長為c a 開始位置 b 結束位置 不包含 c 步長 序列中每個數的間隔 for迴圈中,會逐個取出in後面序列的值,賦值給元素變數i for迴圈執行的次數 ...