Delphi には、Boolean、ByteBool、WordBool、LongBool の 4 つの事前定義されたブール型があります。このうち、Boolean 型が優先され、残りの 3 つは他のプログラミング言語や Windows 環境との互換性サポートを提供します。これらのブール型はほぼ同じように使用されますが、同じ意味で使用すると予期しない結果が生じる可能性があります。
参考までに簡単な分析を載せておきます。
1. 資源使用量の観点からの比較
1 つのブール型データは 1 バイトのメモリを占有します。
ByteBool 型のデータは 1 バイトのメモリを占有します。
WordBool 型のデータは 2 バイトのメモリを占有します。
LongBool 型データは 4 バイトのメモリを占有します。
開発者がプログラムを設計するときにブール データ型を含む構造体型を構築する場合、リソースの使用量の観点から考慮する必要があります。これらのデータ型は相互に割り当てることができますが、いくつかの特殊な場合には違いがあります。まず次の文を見てください。
タイプ
ByteBoolFile = ByteBool のファイル;
LongBoolFile = LongBool のファイル;
ここで、これら 2 種類のファイルに同じ数のブール値が格納されている場合、ファイル サイズは異なります。これら 2 種類のファイルに従って同じ物理ファイルからデータを読み取る場合、結果はさらに異なります。
以下は ByteBool と LongBool を比較するプログラムです。取得されたファイル test1.bin と test2.bin のファイル サイズはそれぞれ 4 バイトと 16 バイトです。
プロシージャ CompareByteBoolWithLongBool;
定数
FName1 = 'c: est1.bin';
FName2 = 'c: est2.bin';
タイプ
ByteBoolFile = ByteBool のファイル;
LongBoolFile = LongBool のファイル;
変数
BF: バイトブールファイル;
LF: ロングブールファイル;
B: ブール値。
始める
B := 偽;
AssignFile(BF, FName1);
リライト(BF);
Write(BF, B, B, B, B);
ファイルを閉じる(BF);
AssignFile(LF, FName2);
リライト(LF);
Write(LF, B, B, B, B);
ファイルを閉じる(LF);
終わり;
興味のある友人は、これをもとに読書データの違いを比較してみると、さらに奇妙な発見が見つかるでしょう。
2. ブール値演算の観点からの比較
Delphi では、ブール値には、事前定義された定数 True と False のいずれか 1 つだけを割り当てることができます。上記の 4 つのブール データ型には次の関係があります。
ブール値 ByteBool、WordBool、LongBool
偽 < 真 偽 <> 真
順序 (偽) = 0 順序 (偽) = 0
Ord(True) = 1 Ord(True) <> 0
Succ(False) = True Succ(False) = True
Pred(True) = False Pred(False) = True
ブール型が順序付けされているのに対し、他の 3 つのブール型データ型は順序付けされていないことを確認するのは難しくありません。次のプログラムは、これらの違いの一部を示しています。
プロシージャ CompareBooleanWithLongBool;
変数
B: ブール値。
LB: ロングブール。
始める
B := 偽;
LB := 偽;
Ord(B) = Ord(LB) の場合
ShowMessage('Ord(B) = Ord(LB) [B = LB = False]') //実行されます
それ以外
ShowMessage('Ord(B) <> Ord(LB) [B = LB = False]');
B := 本当です。
LB := 真;
Ord(B) = Ord(LB) の場合
ShowMessage('Ord(B) = Ord(LB) [B = LB = True]')
それ以外
ShowMessage('Ord(B) <> Ord(LB) [B = LB = True]');
ShowMessage('Ord(B) = ' + IntToStr(Ord(B))); // 1 である必要があります
ShowMessage('Ord(LB) = ' + IntToStr(Ord(LB))); // -1 の場合もあります
終わり;