In Delphi gibt es vier vordefinierte boolesche Typen: Boolean, ByteBool, WordBool und LongBool. Unter diesen ist der boolesche Typ der bevorzugte boolesche Typ, und die restlichen drei bieten Kompatibilitätsunterstützung für andere Programmiersprachen und Windows-Umgebungen. Diese booleschen Typen werden weitgehend auf die gleiche Weise verwendet, können jedoch bei austauschbarer Verwendung zu unerwarteten Ergebnissen führen.
Hier ist eine einfache Analyse als Referenz.
1. Vergleich aus Sicht der Ressourcennutzung
Ein Datenelement vom Typ Boolean belegt 1 Byte Speicher.
Ein Datenelement vom Typ ByteBool belegt 1 Byte Speicher.
Ein Datenelement vom Typ WordBool belegt 2 Byte Speicher;
Daten vom Typ LongBool belegen 4 Byte Speicher.
Wenn der Entwickler beim Entwerfen eines Programms einen Strukturtyp erstellt, der einen booleschen Datentyp enthält, müssen Überlegungen zur Ressourcennutzung angestellt werden. Obwohl diese Datentypen einander zugeordnet werden können, gibt es in einigen Sonderfällen Unterschiede. Schauen Sie sich zunächst die folgende Aussage an:
Typ
ByteBoolFile = Datei von ByteBool;
LongBoolFile = Datei von LongBool;
Wenn hier die gleiche Anzahl boolescher Werte in diesen beiden Dateitypen gespeichert ist, sind ihre Dateigrößen unterschiedlich. Beim Lesen von Daten aus derselben physischen Datei gemäß diesen beiden Dateitypen sind die Ergebnisse noch unterschiedlicher.
Das Folgende ist ein Programm, das ByteBool und LongBool vergleicht. Die Dateigrößen der erhaltenen Dateien test1.bin und test2.bin betragen 4 Byte bzw. 16 Byte.
PROcedure CompareByteBoolWithLongBool;
const
FName1 = 'c: est1.bin';
FName2 = 'c: est2.bin';
Typ
ByteBoolFile = Datei von ByteBool;
LongBoolFile = Datei von LongBool;
var
BF: ByteBoolFile;
LF: LongBoolFile;
B: Boolescher Wert;
beginnen
B := Falsch;
AssignFile(BF, FName1);
Umschreiben(BF);
Write(BF, B, B, B, B);
CloseFile(BF);
AssignFile(LF, FName2);
Umschreiben(LF);
Write(LF, B, B, B, B);
CloseFile(LF);
Ende;
Interessierte Freunde können auf dieser Grundlage die Unterschiede in den Lesedaten vergleichen und Sie werden auf weitere eigenartige Entdeckungen stoßen.
2. Vergleich aus Sicht boolescher Wertoperationen
In Delphi kann booleschen Werten nur eine der vordefinierten Konstanten True und False zugewiesen werden. Die oben genannten vier booleschen Datentypen haben die folgende Beziehung:
Boolean ByteBool, WordBool, LongBool
Falsch < Wahr Falsch <> Wahr
Ord(False) = 0 Ord(False) = 0
Ord(True) = 1 Ord(True) <> 0
Succ(False) = True Succ(False) = True
Pred(True) = False Pred(False) = True
Es ist nicht schwer zu erkennen, dass der boolesche Datentyp geordnet ist, während die anderen drei booleschen Datentypen ungeordnet sind. Das folgende Programm veranschaulicht einige dieser Unterschiede:
procedure CompareBooleanWithLongBool;
var
B: Boolescher Wert;
LB: LongBool;
beginnen
B := Falsch;
LB := Falsch;
wenn Ord(B) = Ord(LB), dann
ShowMessage('Ord(B) = Ord(LB) [B = LB = False]') //wird ausgeführt
anders
ShowMessage('Ord(B) <> Ord(LB) [B = LB = False]');
B := Wahr;
LB := True;
wenn Ord(B) = Ord(LB), dann
ShowMessage('Ord(B) = Ord(LB) [B = LB = True]')
anders
ShowMessage('Ord(B) <> Ord(LB) [B = LB = True]'); //wird ausgeführt
ShowMessage('Ord(B) = ' + IntToStr(Ord(B))); //Muss 1 sein
ShowMessage('Ord(LB) = ' + IntToStr(Ord(LB))); //kann -1 sein
Ende;