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;

时间: 2024-08-25 08:30:24

Delphi中的布尔类型的相关文章

Java的布尔类型基本介绍_java

Java 有一种表示逻辑值的简单类型,称为布尔型.它的值只能是真或假这两个值中的一个.它是所有的诸如a下面的程序说明了布尔类型的使用: // Demonstrate boolean values. class BoolTest { public static void main(String args[]) { boolean b; b = false; System.out.println("b is " + b); b = true; System.out.println(&quo

do while-在do-while循环语句中关于定义,判断布尔类型的问题

问题描述 在do-while循环语句中关于定义,判断布尔类型的问题 当定义boolean flag=false或者boolean flag=true时,该程序的运行结果是一样的.while(flag)或者while(!flag)与定义的flag没有关系吗?while(flag)的含义永远是falg=true时继续,而while(!flag)的含义永远是!falg=true时继续吗? public class Test { public static void main(String[]args)

psafearray-PSafeArray 的类型在DELPHI中如何用

问题描述 PSafeArray 的类型在DELPHI中如何用 sTmp = Hex$(dData(N * 18 + i)) 上面这名是VB的语法,转成DELPHI的如何写 dData是PSafeArray类型 解决方案 现在我是收到一个PSafeArray类型的返回值,不知道如何读里面的内容,上面的示例是VB的,不知道在DELPHI中如何用

字符统计-在产生布尔类型的表达式中对‘c’赋值如何解决

问题描述 在产生布尔类型的表达式中对'c'赋值如何解决 /* 2.单词计数函数功能:统计输入的单词,然后输出,输出格式:X行,X单词,X个字符(字符包括输入的换行符) */ #include #include ""head.h"" Int32_t main( Int32_t argc const Int32_t* argv[] ) { Int32_t numline = 1numword = 1numchar = 0c = 0; [b] while ((c = ge

select-在应使用条件的上下文(在 &amp;amp;#39;;&amp;amp;#39; 附近)中指定了非布尔类型的表达式。这个问题如何解决?

问题描述 在应使用条件的上下文(在 ';' 附近)中指定了非布尔类型的表达式.这个问题如何解决? 行 46: string sqlstr = "select Place=(SELECT COUNT(DISTINCT totalScore) FROM T_TestMark WHERE a.totalScore >= a.totalScore) as 名次,b.userID as 用户名, a.totalScore as 成绩 FROM T_TestMark AS a INNER JOIN T

select- 在应使用条件的上下文(在 &amp;amp;#39;then&amp;amp;#39; 附近)中指定了非布尔类型的表达式。

问题描述 在应使用条件的上下文(在 'then' 附近)中指定了非布尔类型的表达式. 消息 4145,级别 15,状态 1,第 2 行 在应使用条件的上下文(在 'then' 附近)中指定了非布尔类型的表达式. select case when (ABS (Ultra_oil) > 100 ) and (Ultra_oil > 0 )then 80+(Ultra_oil-100)*1 when (-(80+(ABS(Ultra_oil)-100)*1)) then Ultra_oil*0.8

Delphi中的线程类 - TThread详解&lt;转&gt;

Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了.然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充.线程本质上是进程中一段并发运行的代码.一个进程至少有一个线程,即所谓的主线程.同时还可以有多个子线程.当一个进程中用到超过一个线程时,就是所谓的"多线程".那么这个所谓的"一段代码"

[从C到C++] 1.3 C++布尔类型(bool)

布尔类型(bool)是C++新增的一种基本数据类型.在标准的C语言中并未定义bool类型,如果需要使用bool类型,程序员可以通过宏定义来自定义一个bool类型,定义语句如下: #define bool int #define false 0 #define true 1 也就是将int型定义为bool型,将int型的0和1两个值分别定义为bool类型的两个值true和false. 但是在C++中则不需要这么麻烦,C++中对bool类型已经做出了定义. bool类型是C++语言基本数据结构之一,

如何在Delphi中调用oracle的存储过程返回数据集

oracle|存储过程|数据 选自CSDN http://search.csdn.net/Expert/topic/2280/2280860.xml?temp=2.169436E-02 论坛中JCC0128 网友的发言 [delphi+oracle报表解决方案(一)]delphi中调用oracle的存储过程(分带返回游标,不返回值两种)  关键字: delphi ,oracle存储过程,游标,返回数据集,报表 注:delphi 6+ oracle 8.1.6 一.创建包与包体 1.附:建表aac