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

时间:2011-08-19 13:44:11

标签: c# overflowexception

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

for (int i = 1; i <= int.MaxValue; i++)
{
}

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

int i = int.MaxValue;
Console.WriteLine(i + 1);

最近行为似乎发生了变化。 See the question Arithmetic operation caused OverflowException。这种变化背后的原因是什么?

2 个答案:

答案 0 :(得分:9)

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

所以,这会导致异常:

checked
{
 int i = int.MaxValue;
  Console.WriteLine(i + 1);
}

默认情况下,它们不会设置为执行此操作,因为它们比简单溢出更昂贵。

来自MSDN:

  

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

  

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


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

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

答案 1 :(得分:2)