除了前面介绍过的几种基本值类型以外,还有三类值类型:实数(浮点)类型、记录(结构)类型与静态数组(定长数组)类型。

基本实数类型包括:单精度浮点数(Single)、双精度浮点数(Double)与扩展浮点数(Extended)。它们都标准的IEEE 754浮点数运算类型,由x87浮点运算器进行运算。Single为4字节,Double为8字节,Extended为10字节。此外,Delphi还向前支持Real48浮点数类型,现在已经没什么使用的意义了,它的宽度是6字节。此外,Delphi中还有两个四不像的“实数类型”:Comp与Currency。这两个类型虽然看起来是小数,但实际上却是64位的整数类型,在计算时并不使用x87;可在处理它们的时候,却又使用实数的处理方式。整数类型可以向实数类型进行隐式转换;而由实数向整数转换时,需要使用Trunc()或Round()运算符。这里对实数类型不打算作更多的介绍,因为Delphi对浮点数运算是没有优化的,处理效率非常低。有兴趣的话,可以自己去查看Delphi的帮助文档,以及关于IEEE 754的介绍(如wikipedia上的介绍:中文 英文)。

记录类型属于复合类型,也就是说,它本身并不是一种基本数据类型,而是由其它类型的数据组合而成。记录类型可以说是面向对象的基础,它把一些不同的数据类型组合在一起,看成一个类型;而那些组成它的基本数据类型看作它的一部分进行访问。记录类型是基本的复杂类型之一,有着丰富的语法支持与需要注意的特点,在篇幅上不适合与其它类型放在一起(事实上还要分开讲语法知识点),因此这里就不进行更多的介绍了。

数组类型与记录类型类似,也是一种复合类型。静态数组是数组的子集,区别于动态数组和开放数组(仅用于参数),它们在大多数应用上使用相同的语法,但同时也有着非常大的差异。其中,只有静态数组是值类型,而动态数组则是引用类型(注:对于开放数组来说,由于在一些情况下是对其它数组类型的引用,而在另外一些情况下则会在栈中对实际内容进行复制,所以无法单纯讲它是值类型还是引用类型)。同样,数组(静态数组)类型也是一大类基本的复杂类型之一,需要大量的篇幅进行讲解,因此这里也不再多说了。

在继续介绍其它语法之前,这里再对“值类型”的特点进行一个回顾。在高级语言中,当声明一个变量或运行期常量时,该变量会根据声明所在的位置相应的分配一个地址(如局部变量分配在栈空间中,运行期常量一般放在PE文件的只读数据段中,全局变量在PE文件的可读写数据段中),并具有固定的大小。该大小由SizeOf(Type)确定,并且无法改变。值类型的实际数据放在该地址中,任何对该变量的写操作都会试图去改变这个地址中的数据;而引用类型一般在相应的数据只是一个指针,一般指向堆中的内容,对该类型成员(引用类型都是复杂类型)的写操作一般并不会改变指针的值,而是试图改变指针指向的地址的数据。