Delphi中定義了四種布爾類型:Boolean,ByteBool,WordBool和LongBool。後面三種布爾類型是為了與其他語言兼容而引入的,一般情況下建議使用Boolean類型。
這四種類型的布爾值佔用內存的數量如下:
Boolean 1 Byte
ByteBool 1 Byte
WordBool 2 Bytes(1 Word)
LongBool 4 Bytes(2 Words)
對於ByteBool,WordBool和LongBool三種類型True常量的值為非零,False為零,可以用Ord函數驗證;
而對於Boolean類型,True常量的值為1,False為零。在期望Boolean值的上下文中,編譯器會將ByteBool,WordBool和LongBool三種類型的非零值轉換為True。
然而,在Delphi中布爾表達式和Integer/Real是不兼容的。下面的表格對比了Boolean與ByteBool/WordBool/LongBool在異同:
Boolean
False < True
Ord(False) = 0
Ord(True) = 1
Succ(False) = True
PRed(True) = False
BoolToStr(True) = -1 //這個函數很變態
BoolToStr(False) = 0
ByteBool, WordBool, LongBool
False <> True
Ord(False) = 0
Ord(True) <> 0
Succ(False) = True
Pred(False) = True
BoolToStr這個函數最莫名其妙了,明明說True的值是1,而它卻告訴我們True是-1。函數的原形是:
function BoolToStr(B: Boolean; UseBoolStrs: Boolean = False): string;
下面這個表是函數的轉換規則:
BUseBoolStrsValue of returned string
TrueFalse'-1'
True True TrueBoolStrs數組的第一個值(default, 'TRUE')
False False '0'
False True FalseBoolStrs數組的第一個值(default, 'FALSE')