Delphi中預定義的布爾類型有四種:Boolean ,ByteBool,WordBool,LongBool。其中,Boolean 類型是首選布爾類型,其余三種是為其它編程語言和Windows 環境提供兼容性支持。這些布爾類型在使用上大同小異,但如果混淆使用將可能會有意外結果。
現做簡單辨析供大家參考。
一、從資源占用的角度進行比較
一項Boolean 類型的數據占用 1字節的內存;
一項ByteBool類型的數據占用 1字節的內存;
一項WordBool類型的數據占用 2字節的內存;
一項LongBool類型的數據占用 4字節的內存。
如果開發者在進行程序設計時將構造一種含有布爾數據類型的結構類型,那麼在資源占用方面將有所考慮。盡管這些數據類型之間是可以相互賦值的,但某些特殊情況下是有區別的。首先看下面的語句:
type
ByteBoolFile = file of ByteBool;
LongBoolFile = file of LongBool;
這裡,如果在這兩中類型文件中存儲相同數量的布爾值,其文件大小是不同的。而對同一物理文件按照這兩種類型文件分別讀取數據,其結果更是相去甚遠。
下面是比較ByteBool和LongBool的一段程序,得到的文件 test1.bin和 test2.bin的文件尺寸分別為 4字節和16字節。
procedure CompareByteBoolWithLongBool;
const
FName1 = 'c:test1.bin';
FName2 = 'c:test2.bin';
type
ByteBoolFile = file of ByteBool;
LongBoolFile = file of LongBool;
var
BF: ByteBoolFile;
LF: LongBoolFile;
B: Boolean;
begin
B := False;
AssignFile(BF, FName1);
Rewrite(BF);
Write(BF, B, B, B, B);
CloseFile(BF);
AssignFile(LF, FName2);
Rewrite(LF);
Write(LF, B, B, B, B);
CloseFile(LF);
end;
有興趣的朋友可以在此基礎上再比較一下讀取數據的區別,你會有更奇特的發現。
二、從布爾值的操作角度進行比較
在Delphi中,布爾值只能被賦予預定義的常量True和 False之一。上述四種布爾數據類型有如下關系:
Boolean ByteBool,WordBool,LongBool
False < True False <> True
Ord(False) = 0 Ord(False) = 0
Ord(True) = 1 Ord(True) <> 0
Succ(False) = True Succ(False) = True
Pred(True) = False Pred(False) = True
不難看出,Boolean 類型的有序的,而其它三種布爾數據類型是無序的。下面的程序給出了其中的部分區別:
procedure CompareBooleanWithLongBool;
var
B: Boolean;
LB: LongBool;
begin
B := False;
LB := False;
if Ord(B) = Ord(LB) then
ShowMessage('Ord(B) = Ord(LB) [B = LB = False]') //將被執行
else
ShowMessage('Ord(B) <> Ord(LB) [B = LB = False]');
B := True;
LB := True;
if Ord(B) = Ord(LB) then
ShowMessage('Ord(B) = Ord(LB) [B = LB = True]')
else
ShowMessage('Ord(B) <> Ord(LB) [B = LB = True]'); //將被執行
ShowMessage('Ord(B) = ' + IntToStr(Ord(B))); //一定是 1
ShowMessage('Ord(LB) = ' + IntToStr(Ord(LB))); //可能是-1
end;