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: est1.bin'; 

   FName2 = 'c: est2.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; 

轉http://www.codes51.com/article/detail_496.html

發佈了33 篇原創文章 · 獲贊 4 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章