2.5变量的类型检测和强制转换

巧了我就是萌 提交于 2019-11-28 11:21:02

任何变量的类型检测都是在编译期完成的。因此,变量之间赋值,对于编译器来说,会发生如下的一些事件:

  • 如果两个类型是相同的简单类型,则将源的值复制到目标;
  • 如果两个类型是相同类型的记录或数组,则将简单数据类型的域复制,并添加其他域的引用计数;
  • 如果两个类型是兼容的,则调用类型转换内部例程,并把转换的结果作为目标。

  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)^);

  这种情况下,需要自行保证访问转换后的结果变量的有效性。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!