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: est1.bin';
FName2 = 'c: est2.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;