为什么添加结果大于int.MaxValue的两个大整数不会抛出溢出异常?

ren*_*nil 3 c# overflowexception

如果我们在程序中使用以下循环,则循环永远不会在C#4.0中结束

for (int i = 1; i <= int.MaxValue; i++)
{
}
Run Code Online (Sandbox Code Playgroud)

这是因为向int.MaxValue(2147483647)添加1不会导致溢出异常,但会导致-2147483648(考虑到32位int和2的补充).

int i = int.MaxValue;
Console.WriteLine(i + 1);
Run Code Online (Sandbox Code Playgroud)

最近这种行为似乎发生了变化.请参阅算术操作导致OverflowException的问题.这可能是导致此更改的原因?

Ode*_*ded 9

整数(和其他整数类型)的溢出异常仅在checked上下文中完成.

所以,这会导致异常:

checked
{
 int i = int.MaxValue;
  Console.WriteLine(i + 1);
}
Run Code Online (Sandbox Code Playgroud)

它们默认情况下不会这样做,因为它们比简单溢出更昂贵.

来自MSDN:

checked关键字用于显式启用整数类算术运算和转换的溢出检查.

和:

可以通过编译器选项,环境配置或使用checked关键字来启用溢出检查.


这不是最近的变化 - 从第一天起C#就是这样的.您在问题中看到的是VB.NET代码,默认情况下是在已检查的上下文中.

因此,保持默认值,VB.NET中溢出的代码将引发异常,但C#中的相同代码不会.