1. Object Pascal数据类型
l 数据类型描述了变量和常量的使用情况
l Object Pascal是一种强类型的语言,它可以区分不同的数据类型,而不能随便用一种数据类型代替另一种数据类型。
l 在使用变量和常量时,必须要先对变量或常量进行声明。
l 优点:有利于编译器合法有效的处理数据,不会出现硬件错误。当类型不满足要求时,还可以自定义所需要的数据类型。
1.1 有序数据类型
l 有序数据类型:1、整数类型,2、字符类型,3、布尔类型,4、枚举类型,5、子界类型。
l 任何一个有序类型的数据都有唯一的一个先行数(第一个除外),和唯一的一个后继数(最后一个除外)。
常用函数
函数 | 参数 | 返回值 | 备注 |
Ord | 有序类型表达式 | 有序类型表达式的序号 | 不能处理64位,如Int64 |
Pred | 有序类型表达式 | 表达式前驱的值 | 在有写过程时不可用 |
Succ | 有序类型表达式 | 表达式后继的值 | 在有写过程时不可用 |
High | 有序类型表达式 | 该类型的最大值 | 同样适合于短字符串和数组类型 |
Low | 有序类型表达式 | 该类型的最小值 | 同样适合于短字符串和数组类型 |
l Inc()函数
inc(i)等价于Succ(i)
当i为整数时,i:=i+1
l Dec()函数
Dec(i)等价与Pred(i)
当i为整数是,i:=i-1
1.1.1 整数类型
整型是存储整数数据的类型。是全体带符号整数的统称。
整数类型分为:通用整数类型,和基本整数类型。
通用类型
类型 | 名称 | 字节数 | 取值范围 |
整型 | Integer | 有符号32位 | -2 147 483 648~2 147 483 647 |
序数型 | Cardinal | 无符号32位 | 0~4 294 967 295 |
基本整数类型
类型 | 名称 | 字节数 | 取值范围 |
短整型 | Shortint | 有符号8位 | -128~127 |
小整型 | Smallint | 有符号16位 | -32 768~32 767 |
长整型 | Longint | 有符号32位 | -2 147 483 648~2 147 483 647 |
64位整型 | Int64 | 有符号64位 | -263~263-1 |
字节型 | Byte | 无符号8位 | 0~255 |
字型 | Word | 无符号16位 | 0~65535 |
不同数据类型,其存储能力截然不同,因此,我们尽量推荐使用通用类型:Integer,Cardinal。这两种类型可以最大限度的发挥CPU和操作系统的性能。
1.1.2 字符类型
l 字符类型只能存储一个字符
类型 | 名称 | 字节数 | 取值范围 |
字符型 | Char | 1(2)字节 | 存储一个ANSI字符,通用类型。 |
Ansi字符型 | AnsiChar | 1字节 | 存储一个ANSI字符,基本类型。 |
宽字符型 | WideChar | 2字节 | 存储一个Unicode字符,基本类型。 |
l ANSI字符集是扩展的ASCII字符集,每个字符占一个字节。
l WideChar用来支持Unicode。每个Unicode字符占用2个字节。有65536种取值。可以表达世界上的所有语言。
l 每个字符都对应一个有序整数,其值是对应的ASCII字符的位置
l Chr()函数或#符号
该函数返回ASCII中某序数所代表的字符,与Ord()函数互为逆函数。
eg: MyChar:=chr(65) //返回A
Mychar:=#65 //返回A
l UpCase()函数
该函数将小写字母转换为大写字母,
eg: UpCase(a) //返回A
UpCase(A) //返回A
1.1.3 布尔类型
用于逻辑运算
类型 | 名称 | 字节数 | 取值 |
布尔型 | Boolean | 1 | 只能为0(False)或1(True) |
字节布尔型 | ByteBool | 1 | 0(False)或非0(True) |
宽布尔型 | WideBool | 2 | 0(False)或非0(True) |
长布尔型 | LongBool | 4 | 0(False)或非0(True) |
l Boolean是通用类型。推荐使用Boolean。它占用最少的内存空间。
l 3种基本类型:ByteBool,WideBool,Longbool,是为了兼容其他语言而设置的。当表达式的值为0时,则可认为表达式的值是False,而当表达式的值为非0时,则可认为表达式的值是True。
有序数据类型函数计算
函数 | 返回值 |
Ord(False) | 0 |
Ord(True) | 1 |
Succ(False) | True |
Pred(True) | False |
High(True) | True |
Low(True) | False |
1.1.4 枚举类型
l 枚举类型是通过枚举的方式将该种类型的所有取值用标识符一一列举出来。
l 定义的一般格式:
Type
TypeName=(val1,val2,…,valn);
……
Var
VariableName:TypeName;
……
l Type:类型说明标识符。TypeName是枚举类型名称。Val是自定义的枚举常量,是一组标记符号,标记符号数目不能超过255个。
l 两点注意规则:
1、每个枚举常量必须是标识符,不能是其他数据类型。
2、在枚举定义语句中,一个枚举常量只能出现一次。
eg:
Type
weeks=(Sunday,Monday,Tuesday,
Wednesday,Thurday,Friday,Saturday);
Var
w:weeks;
l 枚举类型是使用整数值来储存的。枚举类型的每一个值对应一个整数值。
l 默认情况下,每个值都会根据定义的顺序(从0开始),向右依次增加1。Eg:
w:=Wednesday;
ord(w)将返回值3
w:=Sunday;
ord(w)将返回值0
l 通过=运算符重写赋值过程,自定义每个枚举的实际值。 eg:
l Type
weeks=(Sunday=1,Monday=2,Tuesday=4,Wednesday,Friday,Thurday,Saturday=Sunday+Tuesday);
l 若枚举项未被赋值,则未被赋值的枚举项会自动获得一个初始值。最后一个明确赋值的枚举项的序列值上加1。
l 问题:多个枚举项的序数值相同。
l 枚举常量不能参与运算,必须通过枚举变量进行运算。Eg:
w:=Monday; //正确的操作
Sunday+Monday; //错误的操作
l 枚举类型的常用Case间接的输出。Eg:
Case number of
0:showmessage(‘Sunday’);
1:showmessage(‘Monday’);
2:showmessage(‘Tuesday’);
End;
1.1.5 子界类型
l 子界类型是由1、整型 2、字符型 3、枚举型 4、布尔型中的某两个常量指定的该类型的值域区间。
l 定义的一般类型:
Type
TypeName=ConstLow . . ConstHigh;
Var
VirableName:TypeName;
l Type:类型说明标识符。TypeName是子界变量名称。ConstLow是下界常量,ConstHigh是上界常量,
l 几点注意规则:
1、子界类型的上、下界常量必修是同一重类型,并且是有序类型。
2、子界类型的上、下界必修依次有序递增。
3、子界类型变量具有基类型数据的所有运算特性,但运算结果必须在所定义的上下界范围内。
4、一个子界类型继承它的常量类型的运算符和标准函数。
5、常量类型相容的不同子界类型可以混合运算。
l 子界类型与其基类型之间,以及同一基类型的不同子界之间可以混合运算。
l 子界类型赋值时,应该保证右端表达式的值不超过左端变量所允许的范围。
l 参加运算的各量应满足类型相容性,赋值时,应满足赋值相容性。
附: 练习题
1、创建一个delphi应用程序,在窗体中加入一个button1、一个edit1和一个edit2;在程序中声明一个weeks的枚举类型,类型中包括一个星期的七天,例如:
weeks=(Sunday,Monday,Tuesday,Wednesday,Thurday,Friday,Saturday)
声明一个weeks的变量w,
并把这个变量w的值显示在edit1中,
在edit2中显示w的序号值。
Type weeks = (Sunday,Monday,Tuesday,Wednesday,Thurday,Friday,Saturday); var w:weeks;
procedure TForm1.Button1Click(Sender: TObject); begin w := Monday; self.Edit1.Text := 'Monday'; self.Edit2.Text := inttostr(ord(w)); end;
|
2、创建一个delphi应用程序,在窗体中加入一个button1、一个edit1。声明一个子界类型值,字界类型值从1至500。声明此子界类型值的一个变量z1。给这个变量赋值1000,会有何结果?请编程,并截图。
Type cq1 = 1..500; var z1:cq1;
procedure TForm1.Button1Click(Sender: TObject); begin z1 := 1000;
|
超出界限,出现错误: [Error] Unit1.pas(33): Constant expression violates subrange bounds