Delphi中Int64类型Case语句报错:下界超上界/重复标签问题咨询
Delphi Case语句处理Int64区间报错的原因及解决办法
报错核心原因
- Delphi原生的Case语句不支持Int64(64位整数)作为case表达式,不管你对参数做Abs运算还是加类型转换,本质还是在给Case传64位值,编译器无法正确解析64位数值的区间判断逻辑。
- 当你写
Case Abs(Z) of 1..1000: ...这类代码时,编译器会默认把区间当成32位整数处理。如果Abs(Z)的范围超出32位,数值会被截断,要么出现截断后的下界大于上界(触发“Low bound exceeds high bound”),要么不同的64位区间被截断后变成相同的32位区间(触发“Duplicate case label”)。 - 加不加
Int64()转换都没用,因为编译器本身不支持Case表达式用64位类型。
替代解决方法
直接用if-else嵌套判断,逻辑清晰且能完美处理Int64的区间,完全避开Case的限制:
function cntCaseTbl(Z: Int64): Integer; var AbsZ: Int64; begin AbsZ := Abs(Z); if AbsZ <= 1000 then Result := 1 else if AbsZ <= 5000 then Result := 2 else if AbsZ <= 10000 then Result := 3 else Result := 4; // 自定义其他区间的返回值 end;
如果你的业务场景中Abs(Z)的实际值不会超过32位整数的最大值(MaxInt),也可以先把Int64转成32位整数再用Case,但这种方法有溢出风险,不推荐在不确定数值范围时使用:
function cntCaseTbl(Z: Int64): Integer; var AbsZ: Integer; begin AbsZ := Integer(Abs(Z)); // 仅当Abs(Z) <= MaxInt时安全 case AbsZ of 0..1000: Result := 1; 1001..5000: Result := 2; 5001..10000: Result := 3; else Result := 4; end; end;
内容的提问来源于stack exchange,提问作者Greg T
相关产品推荐
相关产品推荐

