程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi中布爾類型辨析

Delphi中布爾類型辨析

編輯:Delphi

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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved