验证超出 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 的回答所示。
有什么方法可以识别不可预知的值是否会超过数字类型的最大值?在以下代码中,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 的回答所示。