任何变量的类型检测都是在编译期完成的。因此,变量之间赋值,对于编译器来说,会发生如下的一些事件:
- 如果两个类型是相同的简单类型,则将源的值复制到目标;
- 如果两个类型是相同类型的记录或数组,则将简单数据类型的域复制,并添加其他域的引用计数;
- 如果两个类型是兼容的,则调用类型转换内部例程,并把转换的结果作为目标。
System.pas中与数据类型相关的例程,主要用于支持兼容类型的转换和赋值。至于像将字符串转换为整数这样的工作,需要交给SysUtils.pas中的例程来完成。System.pas中的类型转换例程是系统自动调用的,而SysUils.pas中的转换是在代码中显式调用的。
如果使用aType(aVar)进行强制类型转换,则只要两个数据类型大小一致,不会调用任何内部例程。数据类型的大小可通过Size0f()来取得。
可以使用无类型指针作为过渡来强制转换任意两个类型的变量,例如:
type //SizeOf(TRecL)=8 TRecL=Record I: Integer; s: String; end; //SizeOf(TArrI)=16 TArrI=array [1..4] of Integer; var L: TRecL; I: TArrI; //... I := TArrI(Pointer(@L)^);
这种情况下,需要自行保证访问转换后的结果变量的有效性。