Delphi中布林型別辨析 (轉)

worldblog發表於2007-12-04
Delphi中布林型別辨析 (轉)[@more@]中布林型別辨析
蘇湧(2000-09-29)
  Delphi中預定義的布林型別有四種:Boolean ,ByteBool,Worool,LongBool。其中,Boolean 型別是首選布林型別,其餘三種是為其它語言和 環境提供相容性支援。這些布林型別在使用上大同小異,但如果混淆使用將可能會有意外結果。

  現做簡單辨析供大家參考。

  

一、從資源佔用的角度進行比較
  一項Boolean 型別的資料佔用 1位元組的;

  一項ByteBool型別的資料佔用 1位元組的記憶體;

  一項Bool型別的資料佔用 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;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987863/,如需轉載,請註明出處,否則將追究法律責任。

相關文章