В Delphi есть четыре предопределенных логических типа: Boolean, ByteBool, WordBool и LongBool. Среди них тип Boolean является предпочтительным типом Boolean, а остальные три обеспечивают поддержку совместимости с другими языками программирования и средами Windows. Эти логические типы используются практически одинаково, но при взаимозаменяемом использовании могут давать неожиданные результаты.
Вот простой анализ для вашей справки.
1. Сравнение с точки зрения использования ресурсов
Часть данных логического типа занимает 1 байт памяти;
Часть данных типа ByteBool занимает 1 байт памяти;
Часть данных типа WordBool занимает 2 байта памяти;
Данные типа LongBool занимают 4 байта памяти.
Если при разработке программы разработчик создает структуру типа, содержащую логический тип данных, необходимо учитывать вопросы использования ресурсов. Хотя эти типы данных можно назначать друг другу, в некоторых особых случаях существуют различия. Сначала посмотрите на следующее утверждение:
тип
ByteBoolFile = файл ByteBool;
LongBoolFile = файл LongBool;
Здесь, если в этих двух типах файлов хранится одинаковое количество логических значений, размеры их файлов будут разными. При чтении данных из одного и того же физического файла по этим двум типам файлов результаты отличаются еще сильнее.
Ниже представлена программа, сравнивающая ByteBool и LongBool. Размеры полученных файлов test1.bin и test2.bin составляют 4 байта и 16 байт соответственно.
Процедура CompareByteBoolWithLongBool;
константа
FName1 = 'c: est1.bin';
FName2 = 'c: est2.bin';
тип
ByteBoolFile = файл ByteBool;
LongBoolFile = файл LongBool;
вар
БФ: БайтеБулФайл;
ЛФ: ЛонгБулФиле;
Б: логическое значение;
начинать
Б := Ложь;
НазначитьФайл(BF, FName1);
Переписать(БФ);
Записать(БФ, Б, Б, Б, Б);
ЗакрытьФайл(БФ);
НазначитьФайл(LF, ИмяF2);
Переписать (LF);
Write(LF, B, B, B, B);
ЗакрытьФайл(LF);
конец;
Заинтересованные друзья могут на этом основании сравнить различия в чтении данных, и вы сделаете еще более своеобразные открытия.
2. Сравнение с точки зрения логических операций над значениями.
В Delphi логическим значениям можно присвоить только одну из предопределенных констант True и False. Вышеупомянутые четыре логических типа данных имеют следующую связь:
Логическое значение ByteBool, WordBool, LongBool
Ложь < Верно Ложь <> Верно
Ord(Ложь) = 0 Ord(Ложь) = 0
Орд(Истина) = 1 Орд(Истина) <> 0
Succ(Ложь) = Истина Succ(Ложь) = Истина
Pred(True) = False Pred(False) = True
Нетрудно заметить, что тип Boolean является упорядоченным, тогда как остальные три типа данных Boolean неупорядочены. Следующая программа иллюстрирует некоторые из этих различий:
процедура CompareBooleanWithLongBool;
вар
Б: логическое значение;
ЛБ: ЛонгБул;
начинать
Б := Ложь;
ЛБ := Ложь;
если Ord(B) = Ord(LB), то
ShowMessage('Ord(B) = Ord(LB) [B = LB = False]') //будет выполнено
еще
ShowMessage('Ord(B) <> Ord(LB) [B = LB = False]');
Б := Верно;
ЛБ := Верно;
если Ord(B) = Ord(LB), то
ShowMessage('Ord(B) = Ord(LB) [B = LB = True]')
еще
ShowMessage('Ord(B) <> Ord(LB) [B = LB = True]'); //будет выполнено
ShowMessage('Ord(B) = ' + IntToStr(Ord(B))) //Должно быть 1
ShowMessage('Ord(LB) = ' + IntToStr(Ord(LB))) //может быть -1;
конец;