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

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

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

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

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

转载于:https://www.cnblogs.com/YiShen/p/9878683.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值