Delphi中的几种布尔类型详解

来源:互联网 发布:淘宝换货能用运费险吗 编辑:程序博客网 时间:2024/06/05 02:07
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

0 0
原创粉丝点击