简单类型(Delphi)

来自RAD Studio
跳转到:航行,搜索

转到数据类型、变量和常量索引

简单类型(包括序数类型和实数类型)定义有序的值集。

序数型

顺序类型包括整数、字符、布尔、枚举和子范围类型。序数类型定义了一组有序的值,其中除第一个值外的每个值都具有唯一的前导值,除最后一个值外,每个值都有唯一的后继值。此外,每个值都有一个序号,它决定了类型的顺序。在大多数情况下,如果值具有序号n个,其前身具有序数n-1个其继任者具有序数n+1个.

对于整数类型,值的序号是值本身。子范围类型保持其基类型的序号。对于其他序号类型,默认情况下,第一个值的序号为0,下一个值的顺序为1,依此类推。枚举类型的声明可以显式覆盖此默认值。

几个预定义函数对序数值和类型标识符进行操作。其中最重要的总结如下。

功能 参数 返回值 评论

订单

顺序表达式

表达式值的顺序

不接受Int64参数。

Pred公司

顺序表达式

表达式值的前置词

成功

顺序表达式

表达式值的后继项

序数类型标识符或序数类型变量

类型中的最大值

还可以操作短字符串类型和数组。

序数类型标识符或序数类型变量

类型中的最小值

还可以操作短字符串类型和数组。


例如,高(字节)返回255,因为类型的最大值字节为255,并且成功(2)返回3,因为3是2的后继。

标准程序股份有限公司12月递增和递减序数变量的值。例如,公司(I)等于I:=成功(I)如果是一个整数变量,到I:=I+1.

整数类型

整数类型表示整数的子集。

整数类型可以是平台相关型平台相关.

平台相关整数类型

转换与平台相关的整数类型以适应当前编译器平台的位大小。依赖于平台的整数类型包括NativeInt公司,NativeUInt公司,LongInt公司、和长单词。尽可能使用这些类型,因为它们可以为底层CPU和操作系统带来最佳性能。下表说明了Delphi编译器的范围和存储格式。

依赖于平台的整数类型

类型 站台 范围 格式 别名

NativeInt公司

32位平台

-2147483648..2147483647
(-231..2^31-1)

有符号32位

整数

64位平台

-9223372036854775808..9223372036854775807
(-263..263-1)

签名64位

国际64

NativeUInt公司

32位平台

0..4294967295
(0..232-1)

无符号32位

红衣主教

64位平台

0..18446744073709551615
(0..264-1)

无符号64位 用户界面64

LongInt公司

32位平台和64位Windows平台

-2147483648..2147483647
(-231..231-1)

有符号32位

整数

64位POSIX平台,包括iOS、macOS、Android和Linux

-9223372036854775808..9223372036854775807
(-263..263-1)

签名64位 国际64

长单词

32位平台和64位Windows平台

0..4294967295
(0..232-1)

无符号32位

红衣主教

64位POSIX平台,包括iOS、macOS、Android和Linux

0..18446744073709551615
(0..264-1)

无符号64位

用户界面64
注:32位平台包括32位Windows和32位Android。

独立于平台的整数类型

无论使用什么平台,平台相关的整数类型始终具有相同的大小。平台相关的整数类型包括短Int,小型Int,LongInt公司,整数,国际64,字节,单词,长单词,红衣主教、和用户界面64.

平台相关整数类型

类型 范围 格式 别名

短Int

-128..127

有符号8位

国际8

小型Int

-32768.32767

带符号16位

国际16

固定Int

-2147483648..2147483647

有符号32位

国际32

整数

-2147483648..2147483647

有符号32位

国际32

国际64

-9223372036854775808.9223372036854775807
(-263..263-1)

签名64位

字节

0..255

无符号8位

用户界面8

单词

0..65535

无符号16位

用户界面16

固定UInt

0..4294967295

无符号32位

UInt32型

红衣主教

0..4294967295

无符号32位

UInt32型

用户界面64

0..18446744073709551615
(0..264-1)

无符号64位


通常,整数的算术运算返回类型为的值整数,相当于32位LongInt公司。操作返回类型为的值国际64仅当在一个或多个上执行时国际64操作数。因此,以下代码会产生错误的结果:

无功功率,无功功率一: 整数;J: Int64;... I:=高(整数);J:=I+1;

要获得国际64这种情况下的返回值,强制转换作为国际64:

。。。J:=国际64(I)+1;

有关更多信息,请参阅算术运算符.

注:一些接受整数参数截断的标准例程国际64值设置为32位。然而,,成功,Pred公司,股份有限公司,12月,IntToStr公司、和整数到十六进制例程完全支持国际64论据。此外圆形,特朗克,StrToInt64结构、和StrToInt64定义函数返回国际64值。一些例行程序无法执行国际64值。

当您递增整数类型的最后一个值或递减整数类型的第一个值时,结果会环绕范围的开始或结束。例如短Int类型的范围为-128..127;因此,在执行代码后:

无功功率,无功功率一: Shortint;。。。I:=高(短);I:=I+1;

的价值为-128。但是,如果启用了编译器范围检查,则此代码会生成运行时错误。

字符类型

字符类型为字符,AnsiChar(安西字符),宽字元,UCS2字符、和UCS4字符:

  • 字符在当前实现中相当于宽字元,现在默认的字符串类型是Unicode字符串.因为字符可以在将来的版本中更改,最好使用标准功能大小Of而不是在编写可能需要处理不同大小字符的程序时使用硬编码常量。
  • AnsiChar(安西字符)值是根据区域设置字符集(可能是多字节)排序的字节大小(8位)字符。
  • 宽字元字符使用多个字节来表示每个字符。在当前的实施中,宽字元是根据Unicode字符集排序的单词大小(16位)字符(请注意,在将来的实现中可能会更长)。前256个Unicode字符对应于ANSI字符。
  • UCS2字符是的别名宽字元.
  • UCS4字符用于处理4字节Unicode字符。

长度为1的字符串常量(例如“A”)可以表示字符值。预定义函数Chr公司返回范围为的任何整数的字符值宽字元; 例如,叶绿素(65)返回字母A。

AnsiChar(安西字符)宽字元值(如整数)在递减或递增超过其范围的开始或结束时进行环绕(除非启用了范围检查)。例如,执行代码后:

无功功率,无功功率字母:AnsiChar;一: 整数;开始字母:=高(字母);对于I:=1至66 do Inc(字母);结束;

信件具有值A(ASCII 65)。

布尔类型

4种预定义的布尔类型是布尔值,字节Bool,WordBool语言、和LongBool公司.布尔值是首选类型。其他语言的存在是为了提供与其他语言和操作系统库的兼容性。

A类布尔值变量占用一个字节的内存字节Bool变量也占用一个字节WordBool语言变量占用2个字节(一个字)LongBool公司变量占用4个字节(2个字)。

布尔值由预定义的常量表示真的False(错误)。以下关系成立:

布尔值 ByteBool、WordBool、LongBool

假<真

错误<>正确

订单(错误)=0

订单(错误)=0

Ord(True)=1

Ord(真)<>0

成功(错误)=正确

成功(假)=正确

Pred(真)=假

Pred(False)=真


类型为的值字节Bool,LongBool公司,或WordBool语言已考虑真的当它的序数为非零时。如果此值出现在布尔值则编译器会自动将任何非零序数值转换为真的.

前面的备注指的是布尔值的序号,而不是值本身。在Delphi中,布尔表达式不能等同于整数或实数。因此,如果X是整数变量,则语句:

如果X,则。。。;

生成编译错误。将变量强制转换为布尔类型是不可靠的,但以下每个替代方法都有效。

如果X<>0,则。。。;{使用返回布尔值的表达式}。。。var OK:布尔值;{使用布尔变量}... 如果X<>0,则好:=真;如果可以,那么。。。;

枚举的类型

枚举类型通过简单列出表示这些值的标识符来定义一组有序的值。这些价值观没有内在意义。要声明枚举类型,请使用以下语法:

 类型 typeName(类型名称)= (值1, ...,瓦伦)

哪里typeName(类型名称)和每个val值是有效的标识符。例如,声明:

type套装=(球杆、钻石、心形、黑桃);

定义一个名为套装,其可能值为俱乐部,钻石,心脏、和黑桃,其中Ord(俱乐部)返回0,Ord(菱形)返回1,依此类推。

当您声明枚举类型时,您要声明每个val值成为类型的常量typeName(类型名称)。如果val值标识符用于同一范围内的另一目的,会发生命名冲突。例如,假设您声明类型:

type TSound=(单击、咔哒声、时钟)

不幸的是,点击也是为TControl定义的方法的名称,以及VCL中从它派生的所有对象。因此,如果您正在编写应用程序,并且创建了一个事件处理程序,如:

过程TForm1.DBGridEnter(发送方:TObject);无功功率,无功功率事物:TSound;开始... Thing:=点击;结束;

您将得到一个编译错误;编译器解释点击在程序范围内作为对点击TForm的方法。您可以通过限定标识符来解决这个问题;因此,如果T声音在中声明我的单位,您将使用:

事物:=我的单位。点击;

然而,更好的解决方案是选择不可能与其他标识符冲突的常量名称。示例:

类型TSound=(tsClick、tsClack、tsClock);TMyColor=(mcRed、mcBlue、mcGreen、mcYellow、mcOrange);答案=(ansYes,ansNo,ansMaybe)

您可以使用(val1,…,valn)直接在变量声明中构造,就像它是类型名一样:

var MyCard:(俱乐部、钻石、红心、黑桃);

但如果你申报我的卡这样,就不能使用这些常量标识符在同一范围内声明另一个变量。因此:

var Card1:(球杆、钻石、心形、黑桃);var Card2:(球杆、钻石、心形、黑桃);

生成编译错误。但是:

var Card1、Card2:(球杆、钻石、心形、黑桃);

编译干净,如下所示:

类型套装=(球杆、钻石、心形、黑桃);无功功率,无功功率卡片1:套装;卡片2:套装;

具有显式指定顺序的枚举类型

默认情况下,枚举值的序号从0开始,并遵循其标识符在类型声明中列出的顺序。您可以通过为声明中的某些或所有值显式分配序号来覆盖此设置。要将序号赋给值,请在其标识符后面加上=常量表达式,其中constantExpression(常量表达式)是一个常数表达式计算结果为整数的。例如:

类型大小=(小=5,中=10,大=小+中);

定义一个名为大小其可能值包括小型,中等、和大型,其中订单(小)返回5,军械库(中型)返回10,并且订单(大)返回15。

枚举类型实际上是一个子范围,其最低和最高值对应于声明中常量的最低和最高序号。在前面的示例中大小类型有11个可能的值,其序号范围为5到15。(因此类型字符数组[Size]表示11个字符的数组。)其中只有三个值具有名称,但其他值可以通过类型转换和以下例程访问Pred公司,成功,股份有限公司、和12月。在以下示例中,“匿名”值的范围为大小分配给变量X(X).

无功功率,无功功率十: 尺寸;开始X:=小;//订单(X)=5X:=尺寸(6);//订单(X)=6收入(X);//订单(X)=7

任何未明确指定序号的值的序号都比列表中前一个值的序号大一。如果第一个值未指定序号,则其序号为0。因此,根据声明:

类型SomeEnum=(e1,e2,e3=1);

SomeEnum公司只有两个可能的值:订单(e1)返回0,订单(e2)返回1,并且订单(e3)也返回1;因为第2页e3(电子3)具有相同的序号,它们代表相同的值。

没有特定值的枚举常量具有RTTI:

类型SomeEnum=(e1,e2,e3);

而具有特定值的枚举常量,例如以下,不具有RTTI:

类型SomeEnum=(e1=1,e2=2,e3=3);

作用域枚举

如果启用{$范围在}编译器指令。

这个{$SCOPEDENUMS开或关}编译器指令启用或禁用Delphi代码中作用域枚举的使用。{$范围在}定义枚举的作用域。{上的$SCOPEDENUMS}影响枚举类型的声明,直到{$SCOPEDENUMS关闭}指令。属性之后声明的枚举类型中引入的枚举的标识符{$范围在}指令未添加到全局范围。要使用作用域枚举标识符,应该使用引入此标识符的枚举类型的名称对其进行限定。

例如,让我们在Unit1.pas文件中定义以下单位

单元 1号机组;
接口
//{$SCOPEDENUMS ON}//清除此指令的注释
 类型
   TMyEnum公司 = (弗斯特, 第二, 第三);
实施
 
结束.

以及使用此单元的以下程序

程序 项目1;
{$APPTYPE控制台}

使用
  系统实用程序, 1号机组 在里面 '单位1.pas';
 
无功功率,无功功率
  //第一个:整数;//清除此变量的注释
  价值: TMyEnum公司;
开始
  尝试
    价值 := 弗斯特;   
//值:=TMyEnum。第一;
//值:=unit1.First;
  除了
     E类:例外 
      Writeln公司(E类.类名称, ': ', E类.消息);
  结束;
结束.

现在我们可以调查{$SCOPEDENUMS}编译器指令的作用域弗斯特,第二、和第三标识符,在TMyEnum公司枚举,可见。

第一,跑步(F9)在这个代码上。代码运行成功。这意味着弗斯特标识符,用于

值:=第一个;

变量,是在

TMyEnum=(第一、第二、第三);

枚举类型。

现在清除来自

{$范围在}

中的编译器指令单位1单位。该指令强制执行TMyEnum公司枚举的作用域。执行运行. TheE2003未声明标识符“First”错误发生在

值:=第一个;

行。它表明{$范围在}编译器指令阻止这个弗斯特标识符,在作用域中引入TMyEnum公司枚举,添加到全局范围。

要使用作用域枚举中引入的标识符,请在引用枚举元素之前添加其类型名称。例如,在第二个

值:=TMyEnum。第一;

的版本价值变量(并注释的第一个版本价值). 执行运行。程序成功运行。这意味着弗斯特标识符在TMyEnum公司范围。

现在评论

//{$范围在}

中的编译器指令单位1然后从声明中清除注释弗斯特变量

第一个:整数;

并再次使用

值:=第一个;

变量。现在计划项目1看起来像这样:

无功功率,无功功率
  弗斯特: 整数;   
  价值: TMyEnum公司;
开始
  尝试
    价值 := 弗斯特;

执行运行. The

第一个:整数;

行导致E2010不兼容类型-“TMyEnum”和“Integer”错误。这意味着全局范围之间发生命名冲突弗斯特中引入的标识符TMyEnum公司枚举和弗斯特变量。您可以通过限定弗斯特标识符单位1定义它的单位。为此,请再次评论价值第三个变量的清晰注释:

值:=unit1.First;

执行运行。程序成功运行。也就是说,现在弗斯特标识符可以通过单位1单位范围。但是如果我们再次启用

{$范围在}

中的编译器指令单位1。编译器生成E2003未声明标识符“First”上的错误

值:=单位1.第一;

行。这意味着{$范围在}阻止添加弗斯特枚举的标识符单位1范围。现在弗斯特标识符仅添加在TMyEnum公司枚举的范围。为了检查这一点,让我们再次使用

值:=TMyEnum。第一;

的版本价值变量。执行运行代码成功了。

子范围类型

子范围类型表示另一个序数类型(称为基类型)中值的子集。模板的任何构造低。。,其中是相同序数类型的常量表达式小于,标识包含以下所有值的子范围类型。例如,如果您声明枚举类型:

类型T颜色=(红色、蓝色、绿色、黄色、橙色、紫色、白色、黑色);

然后可以定义子范围类型,如:

类型TMyColors=绿色。。白色;

在这里TMY颜色包括值绿色,黄色的,橙色,紫色、和白色.

可以使用数字常量和字符(长度为1的字符串常量)定义子范围类型:

类型SomeNumbers=-128..127;Caps='A'..'Z’;

使用数字或字符常量定义子范围时,基类型是包含指定范围的最小整数或字符类型。

这个下限。。上界构造本身用作类型名,因此可以在变量声明中直接使用它。例如:

var SomeNum:1.500;

声明一个整型变量,其值可以在1到500之间的任意范围内。

子范围中每个值的序号从基类型中保留。(在第一个示例中,如果颜色是保存值的变量绿色,订单(颜色)无论是否返回2颜色类型为T颜色TMy颜色.)值不会环绕子范围的开始或结束,即使基是整数或字符类型;超过子范围边界的递增或递减只会将值转换为基类型。因此,虽然:

类型百分位数=0..99;var I:百分位数;... I:=100;

生成错误,代码如下:

。。。I:=99;公司(I);

将值100赋值给(除非启用编译器范围检查)。

在子范围定义中使用常量表达式带来了语法困难。在任何类型声明中,当后面的第一个有意义字符=是左括号,则编译器假定正在定义枚举类型。因此,代码为:

常数X=50;Y=10;类型刻度=(X-Y)*2..(X+Y)*2;

产生错误。通过重写类型声明以避免使用前括号来解决此问题:

类型刻度=2*(X-Y)。。(X+Y)*2;

真实类型

实数类型定义了一组可以用浮点表示法表示的数字。下表给出了64位和32位平台上实际类型的范围和存储格式。

真实类型

类型 站台 近似正范围 有效小数 大小(字节)
实际48 全部的 2.94e-39。。1.70e+38 11-12 6
单个 全部的 1.18e-38。。3.40秒+38秒 7-8 4
双精度 全部的 2.23e-308。。1.79电子+308 15-16 8
真实的 全部的 2.23e-308。。1.79电子+308 15-16 8
扩展 32位英特尔Windows 3.37e-4932。。1.18e+4932 10-20 10
64位Intel Linux
64位Intel macOS
3.37e-4932。。1.18e+4932 10-20 16
64位Intel Windows

ARM平台(32位Android、64位Android,64位iOS,64位macOS)

2.23e-308。。1.79电子+308 15-16 8
Comp公司 全部的 -9223372036854775808.. 9223372036854775807
(-263.. 263-1)
10-20 8
货币 全部的 -922337203685477.5808.. 922337203685477.5807
(-(263+1)/10000.. 263/10000)
10-20 8


以下备注适用于实际类型:

  • 真实48保持向后兼容性。由于其存储格式不是英特尔处理器体系结构的固有格式,因此与其他浮点类型相比,它的性能较慢。
6字节真实48调用了类型真实的在Object Pascal的早期版本中。如果您正在重新编译使用旧的6字节的代码真实的输入Delphi,您可能想将其更改为真实48。您也可以使用{$上的真正兼容性}要旋转的编译器指令真实的回到6字节类型。
  • 扩展在上提供更高的精度32-位平台,而不是其他实际类型。
打开64-位Windows和所有ARM平台扩展是的别名双精度; 也就是说扩展数据类型为8字节。因此,使用扩展在这些平台上与32-位平台,其中扩展为10字节。因此,如果您的应用程序使用扩展数据类型,而浮点操作依赖于精度,则此大小差异可能会影响数据。小心使用扩展如果您正在创建跨平台共享的数据文件。有关更多信息,请参阅64位Windows系统上的扩展数据类型小2个字节.
  • 这个Comp公司(计算)类型是英特尔处理器体系结构固有的,表示64位整数。然而,它被归类为实数,因为它的行为不像序数类型。(例如,不能递增或递减Comp公司值。)Comp公司仅为向后兼容而维护。使用国际64键入以获得更好的性能。
  • 货币是一种定点数据类型,可以最大限度地减少货币计算中的舍入错误。它存储为64位整数,其中4位最低有效数字隐式表示小数位数。在赋值和表达式中与其他实际类型混合时,货币值会自动除以或乘以10000。

另请参见