子界类型探索

Delphi中的子界类型,如果赋值不是常量的话,不会进行范围检查。
如:
type
  TSetA = 1..100;
  TSetB = 1..1000;
var
  vA: TSetA;
  vB: TSetB;
begin
  vB := 998;
  vA := vB;

end;
 
问:vA等于多少,为什么?
答:vA = 230。

TSetA子界类型从1到100,它处在[0..255]的范围中,所以这里编译器把它当作Byte类型处理,长度是8位。
TSetB子界类型从1到1000,编译器把它当成正常的Integer类型。
把TSetB类型向TSetA赋值时,编译器没有经过常量优化,即:vB := 998; vA := vB;时,它不会把vB当成一个常量赋给vA,编译器也不会进行范围检查,就不会报错,这时编译器会取vB的低8位赋给vA。
 
同样:
type
  TSetA = 1..255;
var
  vA: TSetA;
begin
  //vA := 260; //这样传常量的话,编译器会进行范围检查,会报错。
  vA := 255;
  vA := vA + 5;
  Inc(vA, 5);
  //这些操作它就不会报错,但是也会只取低8位。
end;


posted @ 2008-03-22 16:31  Kaming's SAP  阅读(590)  评论(0)    收藏  举报