在C#中没有溢出exception的int?

我曾经在Euler项目 (伟大的网站)10号问题有这个奇怪的经验。 这个任务是计算所有低于200万的素数的总和。

我用了一个整数,我的algorithm产生了一个答案,但是当我粘贴它来validation答案时,这是错误的。

原来,结果太大,不适合int,但这不会导致溢出错误或什么? 相反,它只是返回了一个远离真实答案的价值。

当我把这个types改为很长的时候,所有的东西都是h </s>的。

默认情况下,C#整数操作在溢出时不会引发exception。 您可以通过项目设置或通过checked计算来实现:

 int result = checked(largeInt + otherLargeInt); 

现在操作会抛出。

相反的是unchecked ,这使任何操作显式取消选中。 显然,这只有在项目设置中启用了检查操作时才有意义。

在C#中,不会引发OverflowException (在VB中,每个默认情况下抛出exception)。

为了得到你想要的代码,你必须在你的代码中embedded你的代码:

 byte value = 241; checked { try { sbyte newValue = (sbyte) value; Console.WriteLine("Converted the {0} value {1} to the {2} value {3}.", value.GetType().Name, value, newValue.GetType().Name, newValue); } catch (OverflowException) { Console.WriteLine("Exception: {0} > {1}.", value, SByte.MaxValue); } } 

MSDN更详细地解释:

对于算术,转换或转换操作来引发OverflowException,操作必须发生在已检查的上下文中。 默认情况下,检查Visual Basic中的算术运算和溢出; 在C#中,他们不是。 如果操作发生在未经检查的上下文中,则通过丢弃不符合目标types的任何高位来截断结果。

这是因为,默认情况下,C#不会为整数溢出和下溢而抛出任何exception。 有几件事你可以在这里做。

选项1

您必须启用exception才能抛出Project => properties => Build tab => Advanced =>检查算术溢出下溢(请确保勾选该选项)

在这里输入图像说明

确保你勾选了这个选项

选项2

使用一个选中的块并抛出一个溢出exception来处理这种情况。 示例代码片段将是

  try { checked { int y = 1000000000; short x = (short)y; } } catch (OverflowException ex) { MessageBox.Show("Overflow"); } catch (Exception ex) { MessageBox.Show("Error"); } 

希望对你有帮助… :)

我已经添加了一个cmt,但对你们中的一些人来说也许是有趣的:

msdn告诉我们:

整数算术溢出或者抛出一个OverflowException或者丢弃结果的最高有效位

十进制算术溢出总是抛出一个OverflowException。

当发生整数溢出时,会发生什么取决于执行上下文,可以选中或取消选中。 在检查的上下文中,引发OverflowException。 在未检查的上下文中,结果的最高有效位将被丢弃,并继续执行。 因此,C#提供了处理或忽略溢出的select。

默认情况下,C#不检查整数上的算术溢出。 您可以使用/checked 编译器选项或在Visual Studio中启用“检查算术上溢/下溢”(项目属性 – 生成 – 高级)来更改此项。

您可以使用已checkedunchecked关键字来逐个replace默认值。 如果你依赖于在一段代码中进行checked ,明确地使用checked来启用它将是一个好主意。

 int j = checked(i * 2); checked { int j = i * 2; // Do more stuff } 

请注意,浮点操作永远不会抛出一个OverflowException ,并且十进制操作总是抛出一个OverflowException 。 另请参阅C#运算符 。