第四章 基本类型
基本类型分为序数类型与实数类型两大类。
一.序数类型 ordinal types
除浮点类型外,所有基本类型均为序数类型,可分为整数类型、布尔类型、枚举类型、子界类型。
-
序数类型是可计数的有序的,可进行Inc,Ord,Dec 等操作。
1.1整数类型 integers
类型 | 范围 | 字节 |
8 |
1.2布尔类型 boolean types
布尔类型实际上也是整数类型,True和False的值分别为1和0
ByteBool,WordBool,LongBool,QWordBool分别等值于Byte,Word,Longint,Int64
类型 | 字节 | Ord(True) |
Any nonzero value |
示例:
B := True;
B := False;
B := 1<>2; { 相当于 B := True }
B := True;
B := False;
B := 1<>2; { 相当于 B := True }
备注:在Free Pascal中,默认情况下当知道结果时,将不再对表达式的其余部分求值:这称为快捷布尔值求值。
B := False;
A := B and Func;
函数Func将永远不会被调用,它可能会产生奇怪的副作用。
如果使用{$B +}编译指令,则Func函数会被调用。默认为{$B -}
函数Func将永远不会被调用,它可能会产生奇怪的副作用。
如果使用{$B +}编译指令,则Func函数会被调用。默认为{$B -}
1.3枚举类型 enumeration types
枚举类型声明如下:
Type
Direction = ( North, East, South, West );
Free Pascal还允许枚举类型的C样式扩展
Type
EnumType = (one, two, three, forty := 40,fortyone);
枚举元素应按升序排列。以下将产生编译器错误
Type
EnumType = (one, two, three, forty := 40, thirty := 30);
注意事项:
枚举类型不能使用Pred和Succ函数。
枚举类型使用默认值存储,与默认值的实际数量无关,编译器不会尝试优化空间。可以通过{$ PACKENUM n}编译器指令更改此行为,该指令告诉编译器用于枚举类型的最小字节数。例如
Type
{$PACKENUM 4}
LargeEnum = ( BigOne, BigTwo, BigThree );
{$PACKENUM 1}
SmallEnum = ( one, two, three );
Var S : SmallEnum;
L : LargeEnum;
begin
WriteLn (’Small enum : ’,SizeOf(S));
WriteLn (’Large enum : ’,SizeOf(L));
end.
运行时将会打印以下内容:
Small enum : 1
Large enum : 4
Type
Direction = ( North, East, South, West );
Free Pascal还允许枚举类型的C样式扩展
Type
EnumType = (one, two, three, forty := 40,fortyone);
枚举元素应按升序排列。以下将产生编译器错误
Type
EnumType = (one, two, three, forty := 40, thirty := 30);
注意事项:
枚举类型不能使用Pred和Succ函数。
枚举类型使用默认值存储,与默认值的实际数量无关,编译器不会尝试优化空间。可以通过{$ PACKENUM n}编译器指令更改此行为,该指令告诉编译器用于枚举类型的最小字节数。例如
Type
{$PACKENUM 4}
LargeEnum = ( BigOne, BigTwo, BigThree );
{$PACKENUM 1}
SmallEnum = ( one, two, three );
Var S : SmallEnum;
L : LargeEnum;
begin
WriteLn (’Small enum : ’,SizeOf(S));
WriteLn (’Large enum : ’,SizeOf(L));
end.
运行时将会打印以下内容:
Small enum : 1
Large enum : 4
1.4 子界类型 subrage types
子界类型是序数类型(主类型)中的值范围。要定义子界类型,必须指定该类型的最高和最低值 。
一些预定义的整数类型被定义为子范围类型
Type
Longint = $80000000..$7fffffff;
Integer = -32768..32767;
shortint = -128..127;
byte = 0..255;
Word = 0..65535;
还可以在枚举类型使用子界类型:
Type
Days = (monday,tuesday,wednesday,thursday,friday, saturday,sunday);
WorkDays = monday .. friday;
WeekEnd = Saturday .. Sunday;
Type
Longint = $80000000..$7fffffff;
Integer = -32768..32767;
shortint = -128..127;
byte = 0..255;
Word = 0..65535;
还可以在枚举类型使用子界类型:
Type
Days = (monday,tuesday,wednesday,thursday,friday, saturday,sunday);
WorkDays = monday .. friday;
WeekEnd = Saturday .. Sunday;
二、实数类型
Free Pascal仅支持IEEE浮点类型,使用数学协处理器处理浮点计算。Real类型在本机上可以是Single或是Double类型,取决于本机处理器。
类型 | 范围 | 有效位数 | 字节 |
依赖平台 | |||
注意:
1.实际上Comp类型是一个64位的integer,但并不是所有的平台都支持。
2.Currency类型是定点real类型,内部使用它作为64位整数类型(自动按系数10000缩放),这可以最大限度地减少舍入误差。使用这种类型时应小心:在使用乘法等表达式时,如果中间结果超出货币范围,则表达式的计算可能会出错(失去精度)。