在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中启用“检查算术上溢/下溢”(项目属性 – 生成 – 高级)来更改此项。
您可以使用已checked
和unchecked
关键字来逐个replace默认值。 如果你依赖于在一段代码中进行checked
,明确地使用checked
来启用它将是一个好主意。
int j = checked(i * 2); checked { int j = i * 2; // Do more stuff }
请注意,浮点操作永远不会抛出一个OverflowException
,并且十进制操作总是抛出一个OverflowException
。 另请参阅C#运算符 。