📄 book1.mdb
字号:
Int64 -2^63..2^63? signed 64-bit
Byte 0..255 unsigned 8-bit
Word 0..65535 unsigned 16-bit
Longword 0..4294967295 unsigned 32-bit
一般整数类型的实际范围和存储格式随着Object Pascal的不同实现而不同,但通常根据当前CPU和操作系统来采取最佳的操作方式。
一般整数类型是最常用的整数类型,可以充分利用CPU和操作系统的特性,因此程序中应当尽量使用一般整数类型。基本整数类型独立于操作系统和CPU,只有当应用程序的数据范围或存储格式特别需要时,才使用基本整数类型。
通常情况下,整数的算术运算结果为Integer类型,等价于32位的Longint类型。只有当操作数存在 Int64类型时,才返回Int64类型的值。因此,下面的代码将产生错误的结果:
var I: Integer; J: Int64;
...
I := High(Integer);
J := I + 1;
在这种情况下,要取得一个Int64的值,必须进行类型转换:
J := Int64(I) + 1;
注意:绝大多数例程在遇到Int64时都把它转换为32位。但例程High,Low,Succ,Pred,Inc,Dec,IntToStr和IntToHex则完全支持Int64参数。Round,Trunc,StrToInt64,和StrToInt64Def函数可以返回Int64类型的结果。
(2)字符类型(Char)
字符类型中Char类型设计来只存储一个字符。一个字符占一个字节,因此Char数据类型可以存储256个不同的字符,其对应的整数为0到255。
除了Char数据类型外,Delphi还提供了Char类型的扩展,即AnsiChar和WideChar型。表6-4是字符数据类型的列表。
表6-4 字符整数类型
字符类型 占用字节数 存储内容
AnsiChar 1 存储一个Ansi字符。
WideChar 2 存储一个UniCode字符。
Char 1 目前,对应AnsiChar。但Delphi将来的版本可能对应于WideChar。
Ansi字符集是扩展的ASCII字符集,仍然占一个字节。目前,Char对应AnsiChar,但Borland公司在将来的Delphi版本中可能使Char对应WideChar。
WideChar用来支持泛字符集(Unicode)。Unicode字符占用两个字节,可以有65536种不同的取值,可以表达现代计算机中使用的世界上所有的字符,包括图形符号和用于出版业的特殊符号等。
UniCode字符集的前256个字符对应着ANSI字符。如果你把一个AnsiChar字符放到WideChar字符类型的变量中,WideChar字符类型变量的高字节将全部置为0,AnsiChar字符存放到WideChar字符类型的变量的低字节中。
注意:Windows NT全面支持Unicode字符号集,但Windows 95却不同。如果你希望书写的程序同时能在两种系统上运行,必须使用SizeOf()函数,以确定字符占多少字节。
(3)布尔类型(Boolean)
Boolean数据类型的变量只存储一个逻辑值,例如True或False。共有4种Boolean数据类型,见表6-5。
表6-5 布尔类型
类型 说明
Boolean 占1个字节
ByteBool 占1个字节
WordBool 占2个字节
LongBool 占4个字节
Delphi提供多种Boolean数据类型的目的是为了兼容,因为在某些情况下,Windows需要用一个字(2个字节)或双字(4个字节)来表示一个布尔值。
(4)枚举型
所谓枚举类型,就是用一组数量有限的标识符来表示一组连续的整数常数,在类型定义时就列出该类型可能具有的值。枚举类型是一种用户自定义的简单数据类型。在类型定义时就列出该类型可能具有的值。下面是枚举类型定义的一些例子:type
TDays=(Monday,YuesDay,Wednesday,Thursday,Friday,Saturday,Sunday);
TPrimaryColor=(Red,Yelloow,Blue); TDepartment=(Finance,Personnel,Engineering,Marketing,MIS); TDog=(Poodle,GoldenRetriever,Dachshund,NorwegianElkhound,Beagle);
枚举类型定义中的每个值都对应一个整数,整数值由该值在类型定义表中的位置决定,通常类型定义的第一个数对应的整数值为0。例如,在TDay类型定义中Monday对应值为0、Tuesday值为1,等等。如果你把DayOfWeek定义为Integer,通过赋整数值来代表星期几,也可以得到同样的结果。但是,由于枚举类型表达的意思明确、直观、便于记忆,因此使用枚举类型仍有必要。
下面是声明一个枚举类型的语法(图6.2)。
其中标识符列表中的标识符之间用逗号隔开,它列出该类型可能具有的值。
下面是声明一个枚举类型变量的举例:
var DayOfWeek:TDays;
Hue:TPrimaryColor;
Department:TDepartment;
Dogbreed:TDog;
也可以把类型声明和变量声明合二为一,例如:
var DayOfWeek:(Monday,YuesDay,Wednesday,Thursday,Friday,Saturday,Sunday);
在声明枚举类型和枚举变量时,请注意以下几点:
1)枚举的元素只能是标识符,标识符的命名必须符合 Pascal关于标识符的规定,例如下面的声明就是错误的:
type TDays=(0,1,2,3,4,5,6,7);
2)同一个枚举元素不能出现在多个枚举类型中。例如下面的声明就是错误的:
type TColors1=(Red,Blue,Green,White,Black);
TColors2=(Yellow,Lime,Silver,Green);
两个类型变量中都有Green元素,是不允许的。
3)不能直接用枚举类型中的元素参加运算,例如,下面的语句就是错误的:
X:=Red+Blue;
但是,可以用某个枚举类型中的元素对枚举变量赋值,例如,下面的语句:
DayOfWeek:=Monday;
(5)子界型
子界类型是Integer,Boolean,Char及枚举型等称为宿主类型数据的一个子集。当你要限制一个变量的数据范围时,使用子界类型就特别有用。子界类型也是一种用户自定义的简单数据类型。要定义子界类型,必须说明区间的最大值和最小值,下面是子界类型定义的一些例子:
type TCompassRange = 0..360;
TValidLetter ='A'..'F'
TMonthlyIncome=10000..30000;
THours =0..23; TPrecipitation=(Drizzle,Showers,Rain,Downpour,Thunderstorm); {枚举型}
TRain =Drizzle..Downpour; {上面枚举型的子界型}
下面是声明一个子界类型的语法规则(图6.3)。
其中两个常数(称为上界和下界)必须是同一种有序类型,如Integer,Boolean,Char及枚举型等,但不能是Real数据类型。第一个常数必须小于或等于第二个常数。
下面是声明子界类型变量的举例:
var Compass:TCompassRange;
ValidChar:TValidLetter;
在声明子界类型和子界类型变量时,请注意以下几点:
1)上界常数和下界常数必须是同一类型,且都是有序类型。
2)子界类型变量具有宿主类型数据的所有运算特性,但运算的结果必须在范围内。
3)上界常数和下界常数可以是表达式。例如:
const X = 10; Y = 50;
type Color = (Red, Green, Blue);
Scale = X * 2..X * 20;
2.实数类型(Real)
实数类型是带有小数部分的数值,存储实数。有6种不同的Real数据类型,它们在范围、精确度、大小等方面都不相同。见表6-6。
实数类型
数据类型 取值范围 有效位 存储字节
Real48 2.9 x 10^-39 .. 1.7 x 10^38 11..12 6
Single 1.5 x 10^-35 .. 3.4 x 10^38 7..8 4
Double 5.0 x 10^-324 .. 1.7 x 10^308 15..16 8
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19..20 10
Comp -2^63+1 .. 2^63 ? 19..20 8
Currency 22337203685477.5808..922337203685477.5807 19..20 8
当前通常使用的Real等价与Double。
6.3.2 字符串类型
Delphi在处理字符串时,提供了多种方式,表6-7是Delphi使用的字符串类型。
表6-7 字符串类型
类型 最大长度 存储的字符 是否以Null结尾
ShortString 255个字符 AnsiChar 否
AnsiString~ 2^31个字符 AnsiChar 是
String 或者255或者~2^31个字符 ANSIChar都可能
WideString ~2^30个字符 WideChar 是
从上表可知,Delphi主要支持两种类型的字符串: ShortString和AnsiString。WideString类似于AnsiString,只是其存储的字符为WideChar。
ShortString数据类型定义的是长度在1到255之间动态长度字符串。像数组一样,单个字符可以通过引用它们的索引进行存取。位于0的字节存储了代表字符串当前所赋值长度的数值(只能通过关闭范围检查才能访问)。ShortString数据类型主要是为了能和Delphi 1.0和Borland Pascal的早期版本兼容。
AnsiString(又称为long String或huge String)数据类型的定义是动态分配的,长度几乎可以无限的(仅受可用内存限制)以NULL结尾的字符串。AnsiString中的字符由AnsiChar数据类型的字符组成。
建议最好使用AnsiString数据类型。这是因为AnsiString数据类型的变量是动态分配的,当把一个更长的字符串放入AnsiString数据类型的变量时,Delphi会从新为该变量申请空间。如果要显式地改变字符串的长度,可以使用SetLength() 函数来分配一块恰当的内存;使用AnsiString数据类型的另外一个优点是,AnsiString字符串是以NULL结尾,即在最后一个字符之后自动加上一个NULL字符表示字符串结束,与操作系统的大多数函数例程兼容,例如Win32 API,从而在调用操作系统函数例程时更加方便,不需要使用StrPCopy()来将以Pascal风格的字符串转换为以NULL结尾的字符串。Delphi VCL构件的所有特性、事件使用AnsiString来传递参数,以简化、统一VCL和API之间的接口。
String既可以是SHortString类型也可以是AnsiString类型,缺省是AnsiString类型。例如,如果你像下面那样定义字符串:
var S: String;// S is an AnsiString
则编译器假定你要创建一个AnsiString数据类型变量。
使用$H编译命令可以改变缺省定义。当在程序中把编译开关$H的状态改为{H-}时,String缺省是ShortString类型;当在程序中把编译开关$H的状态改为{H+}时,String缺省是AnsiString类型。例如:
var {$H-} S1: String; // S1 is a ShortString
{$H+}
S2: String; // S2 is an AnsiString
如果定义中指明了长度(最大为25 5),则String为ShortString。例如:
var S: String[63]; // S是一个 长度为63的ShortString变量。
6.3.3 结构数据类型
结构类型在内存中存储一组相关的数据项,而不是像简单数据类型那样单一的数值。Object Pascal结构类型包括集合类型、数组类型、记录类型、文件类型、类类型、类引用类型、接口类型等。这里,我们只介绍集合类型、数组类型、记录类型和文件类型。类类型、类引用类型和接口类型放在下一章介绍。
1.数组(Array)
数组是一种数据类型数据的有序集合,是代表一定数量具有相同类型变量的一种数据类型。Object Pascal数组可与任何简单数据类型或字符串类型等一起使用。数组可用于声明一个简单变量或作为一个记录类型定义的组成部分。
(1)数组的定义
下面是声明一个数组类型的语法规则(图6.4)。
要声明一个数组变量,要求你提供一个标识符,使用array保留词,在方括号中指定数组的界限,并指定编译器数组将用于存储什么类型,例如:
Var Check:array[1..100] of Integer;
范围标点‘..’用于表示Check是一个有100个整数的数组,这些整数从1到100编号。范围编号是一个子界类型,可以是0,也可以是正数或负数,或者字符,或其它有序类型。
下面是声明数组类型及数组类型变量的举例:
Type TCheck = array [1..100] of Integer;
Var CheckingAccount:TCheck;
上面是先定义数组类型,然后定义数组变量。其实上,也可以同时定义类型、变量,例如:
var Kelvin:array[0..1000] of Temperatures;
TwentiethCentury: array[1901..2000] of Events;
LessThanzeroo: array[-999..-400] of Shortint;
DigiTValues:array ['0'..'9' of Byte;
SecretCode:array[''A'..'Z' of char;
访问数组中的元素很简单,只要在标识符后面的方括号中给出指定的元素的索引号即可。例如:
Check[5]:=12;
J:=9;
Check[J]:=24;
要访问数组中的所有元素,可以使用循环语句。例如 :
For J:=1 to 10 do Check[J]:=0;
(2)多维数组
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -