學習結構 記錄 型別 9 變體結構

2021-09-08 15:23:29 字數 2143 閱讀 8378

變體結構也就是變體記錄, 是乙個比較複雜的概念. 專家不提倡使用.

興趣所致, 我想把它弄明白.

乙個最大的無符號整數(cardinal)是 4294967295, 它的大小是 4 位元組, 它的二進位制表示是:

11111111 11111111 11111111 11111111

它的低位元組的值是 11111111, 也就是十進位制的 255

//測試:

var c: cardinal;

begin

c := 4294967295;

showmessage(inttostr(lo(c)));

end;

乙個 byte 型別的最大值是 255, 它的大小是 1 個位元組, 用二進位制表示是:

11111111

假如把乙個 cardinal 型別的值賦給乙個 byte 型別的值, byte 將只取 cardinal 的最低位元組.

//測試:

var c: cardinal;

b: byte;

begin

c := 4294967295;

b := c;

showmessage(inttostr(b));

c := 258;

b := c;

showmessage(inttostr(b));

end;

這是我們能否會想到, 在結構會儲存時, 乙個可以儲存 cardinal 的空間, 當然也能得放下乙個 byte 值;

如果這個值非此即彼, 我們完全不需要兩個儲存空間.

我猜測, 這應該是 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迴圈執行的次數 ...