Existem quatro tipos booleanos predefinidos no Delphi: Boolean, ByteBool, WordBool e LongBool. Entre eles, o tipo booleano é o tipo booleano preferido, e os três restantes fornecem suporte de compatibilidade para outras linguagens de programação e ambientes Windows. Esses tipos booleanos são usados da mesma maneira, mas podem ter resultados inesperados se usados de forma intercambiável.
Aqui está uma análise simples para sua referência.
1. Comparação do ponto de vista do uso de recursos
Um dado do tipo booleano ocupa 1 byte de memória;
Um dado do tipo ByteBool ocupa 1 byte de memória;
Um dado do tipo WordBool ocupa 2 bytes de memória;
Um dado do tipo LongBool ocupa 4 bytes de memória.
Se o desenvolvedor construir um tipo de estrutura contendo um tipo de dados booleano ao projetar um programa, haverá considerações em termos de uso de recursos. Embora esses tipos de dados possam ser atribuídos entre si, existem diferenças em alguns casos especiais. Primeiro observe a seguinte afirmação:
tipo
ByteBoolFile = arquivo do ByteBool;
LongBoolFile = arquivo do LongBool;
Aqui, se o mesmo número de valores booleanos for armazenado nesses dois tipos de arquivos, seus tamanhos de arquivo serão diferentes. Ao ler dados do mesmo arquivo físico de acordo com esses dois tipos de arquivos, os resultados são ainda mais diferentes.
A seguir está um programa que compara ByteBool e LongBool. Os tamanhos dos arquivos obtidos test1.bin e test2.bin são 4 bytes e 16 bytes, respectivamente.
Procedimento CompareByteBoolWithLongBool;
const
FNome1 = 'c: est1.bin';
FNome2 = 'c:est2.bin';
tipo
ByteBoolFile = arquivo do ByteBool;
LongBoolFile = arquivo do LongBool;
var
BF: ByteBoolArquivo;
LF: LongBoolFile;
B: Booleano;
começar
B:= Falso;
AtribuirArquivo(BF, FNome1);
Reescrever(BF);
Escreva(BF, B, B, B, B);
FecharArquivo(BF);
AtribuirArquivo(LF, FNome2);
Reescrever(LF);
Escreva(LF, B, B, B, B);
FecharArquivo(LF);
fim;
Amigos interessados podem comparar as diferenças na leitura de dados com base nisso e você encontrará descobertas mais peculiares.
2. Comparação na perspectiva das operações de valor booleano
No Delphi, os valores booleanos só podem receber uma das constantes predefinidas True e False. Os quatro tipos de dados booleanos acima têm o seguinte relacionamento:
Booleano ByteBool, WordBool, LongBool
Falso < Verdadeiro Falso <> Verdadeiro
Ord(Falso) = 0 Ord(Falso) = 0
Ord(Verdadeiro) = 1 Ord(Verdadeiro) <> 0
Succ(Falso) = Verdadeiro Succ(Falso) = Verdadeiro
Pred(Verdadeiro) = Falso Pred(Falso) = Verdadeiro
Não é difícil ver que o tipo booleano é ordenado, enquanto os outros três tipos de dados booleanos são desordenados. O programa a seguir ilustra algumas dessas diferenças:
procedimento CompareBooleanWithLongBool;
var
B: Booleano;
LB: LongBool;
começar
B:= Falso;
LB := Falso;
se Ord(B) = Ord(LB) então
ShowMessage('Ord(B) = Ord(LB) [B = LB = False]') //será executado
outro
ShowMessage('Ord(B) <> Ord(LB) [B = LB = False]');
B:= Verdadeiro;
LB:= Verdadeiro;
se Ord(B) = Ord(LB) então
ShowMessage('Ord(B) = Ord(LB) [B = LB = Verdadeiro]')
outro
ShowMessage('Ord(B) <> Ord(LB) [B = LB = True]'); //será executado
ShowMessage('Ord(B) = ' + IntToStr(Ord(B))); //Deve ser 1
ShowMessage('Ord(LB) = ' + IntToStr(Ord(LB))); //pode ser -1
fim;