Delphi中布林型別辨析 (轉)
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;
蘇湧(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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- TypeScript 布林型別TypeScript型別
- SCSS 布林 型別CSS型別
- javascript型別系統——布林Boolean型別JavaScript型別Boolean
- 把一個任意型別的值轉換為布林型別型別
- java布林型別易錯點Java型別
- javascript 布林型別值判斷JavaScript型別
- Python基本資料型別:布林型別(Boolean)Python資料型別Boolean
- C#快速入門教程(10)——布林型別與布林運算C#型別
- C 語言之布林型別介紹型別
- Kotlin 資料型別詳解:數字、字元、布林值與型別轉換指南Kotlin資料型別字元
- 05 Windows批處理中的字串和布林資料型別Windows字串資料型別
- 布林線指標(轉載)指標
- php中empty()、isset()、is_null()和變數本身的布林判斷區別(轉)PHPNull變數
- python 判斷一個表示式是什麼布林型別bool()Python型別
- 布林帶策略
- Python - 基本資料型別_Number 數字、bool 布林、complex 複數Python資料型別
- C++ 數學函式、標頭檔案及布林型別詳解C++函式型別
- 5.注意Dart中的布林值Dart
- lua與c++ 中布林布bool值對應關係C++
- 『無為則無心』Python基礎 — 8、Python中的資料型別(數值、布林、字串)Python資料型別字串
- delphi中的字串處理,以及幾個字串型別的說明。 (轉)字串型別
- Solidity語言學習筆記————10、布林型、整型Solid筆記
- php中empty()、isset()、is_null()和變數本身的布林判斷區別PHPNull變數
- 面試題:布林變數面試題變數
- HTML 布林屬性值HTML
- 布林代數入門
- 【冰山白皮書】JS中的布林 數字 字串JS字串
- 杜布林衝突的系統分析模型(轉載)模型
- 你好,布林瑪!(Blazor元件庫)Blazor元件
- python-布林運算Python
- Python 為什麼要在 18 年前引入布林型別?且與 C、C++ 和 Java 都不同?Python型別C++Java
- Python中的布林值用途及特點介紹!Python
- 條件和布林操作符
- MySQL手注之盲注(布林)MySql
- Delphi中用於讀寫(I/O)的三種檔案型別 (轉)型別
- C++中的向上型別轉換和向下型別轉換C++型別
- java中的型別轉換Java型別
- ABAP中Char型別資料轉換成Decimal型別型別Decimal