验证超出 Delphi 中的数字类型限制

Verification of exceeding numeric type limit in Delphi

有什么方法可以识别不可预知的值是否会超过数字类型的最大值?在以下代码中,if 子句的结果始终为 false,并且不会引发异常。

procedure TForm1.FormClick(Sender: TObject);
var
  _Integer1, _Integer2: Integer;
begin
  _Integer1 := MaxInt;

  _Integer2 := _Integer1 + _Integer1;

  if _Integer2 > MaxInt then
  begin
    Caption := '';
  end
  else
  begin
    Caption := IntToStr(_Integer2); // -2
  end;
end;

你的 _Integer2 > MaxInt 永远不会 return True 因为这是不可能的。 Integer 的值永远不能大于 Integer.

的最大可能值

但是,您可以启用 overflow checking:

var
  x, y, z: Integer;
begin

  {$Q+}                         // enable overflow checking

  x := MaxInt div 2;
  y := MaxInt div 4;

  z := x + y;                   // fine

  ShowMessage(z.ToString);

  x := MaxInt div 2;
  y := 3 * (MaxInt div 4);

  try
    z := x + y;                 // exception
    ShowMessage(z.ToString);    // won't run
  except
    on EIntOverflow do
      ShowMessage('Integer overflow.');
  end;

在这里,我使用编译器指令在本地启用溢出检查:{$Q+}。如果你想在特定的函数或过程中使用溢出检查,你可以将它与重置器一起使用,如 this answer 但相反。

您还可以使用 Project > Options > Delphi 为整个项目启用它编译器 > 编译 > 运行时错误 > 溢出检查。请记住,此设置是每个配置(例如,调试与发布)。

您可以将结果保存为更大的整数类型,例如:

procedure TForm1.FormClick(Sender: TObject);
var
  _Integer1: Integer;
  _Integer2: Int64;
begin
  _Integer1 := MaxInt;

  _Integer2 := Int64(_Integer1) + _Integer1;

  if _Integer2 > MaxInt then
  begin
    Caption := '';
  end
  else
  begin
    Caption := IntToStr(_Integer2);
  end;
end;

或者,您可以手动计算可用数量space,例如:

procedure TForm1.FormClick(Sender: TObject);
var
  _Integer1, _Integer2: Integer;
begin
  _Integer1 := MaxInt;

  if (MaxInt - _Integer1) < _Integer1 then
  begin
    Caption := '';
  end
  else
  begin
    _Integer2 := _Integer1 + _Integer1;
    Caption := IntToStr(_Integer2);
  end;
end;

或者,您可以启用溢出检查,如 Andreas 的回答所示。