子界类型探索
Delphi中的子界类型,如果赋值不是常量的话,不会进行范围检查。
如:
如:
type
TSetA = 1..100;
TSetB = 1..1000;
var
vA: TSetA;
vB: TSetB;
begin
vB := 998;
vA := vB;
end;
TSetA = 1..100;
TSetB = 1..1000;
var
vA: TSetA;
vB: TSetB;
begin
vB := 998;
vA := vB;
end;
问:vA等于多少,为什么?
答:vA = 230。
答: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;
浙公网安备 33010602011771号