You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 04:37:02