我在Project Euler(顺便说一句很棒的网站)上遇到了第10个问题的奇怪经历.任务是计算低于200万的所有素数之和.
我使用了一个int作为总和,我的算法产生了答案,但是当我粘贴它来验证答案时,它是错误的.
结果是结果太大而不适合int,但这不会导致溢出错误或其他什么?相反,它只返回了一个远离真实答案的值.
当我把类型改为long时,一切都很笨拙.
Kon*_*lph 90
默认情况下,C#整数操作在溢出时不会抛出异常.您可以通过项目设置或进行计算来实现checked:
int result = checked(largeInt + otherLargeInt);
Run Code Online (Sandbox Code Playgroud)
现在操作将抛出.
相反的是unchecked,这使得任何操作都明确取消选中.显然,这只有在项目设置中启用了检查操作时才有意义.
Dir*_*mar 20
在C#OverflowException中没有抛出(在VB中,默认情况下抛出异常).
要获得重要性,您必须将代码嵌入checked上下文中:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
MSDN更详细地解释:
对于抛出OverflowException的算术,转换或转换操作,操作必须在已检查的上下文中进行.默认情况下,检查Visual Basic中的算术运算和溢出; 在C#中,它们不是.如果操作发生在未经检查的上下文中,则通过丢弃不适合目标类型的任何高位来截断结果.
osh*_*csd 15
这是因为,默认情况下,C#不会抛出整数溢出和下溢的任何异常.你可以在这里做几件事.
选项1
您必须通过转到Project => properties => Build tab => Advanced => check for arithmetic overflow underflow来启用异常抛出.(确保勾选该选项)

确保勾选该选项
选项2
使用选中的块并抛出溢出异常来处理这种情况.一个示例代码片段即可
try
{
checked
{
int y = 1000000000;
short x = (short)y;
}
}
catch (OverflowException ex)
{
MessageBox.Show("Overflow");
}
catch (Exception ex)
{
MessageBox.Show("Error");
}
Run Code Online (Sandbox Code Playgroud)
希望对你有帮助... :)
默认情况下,C#不检查整数上的算术溢出.您可以使用/checked 编译器选项或在Visual Studio中启用"检查算术溢出/下溢"(项目属性 - 构建 - 高级)来更改此设置.
您可以根据具体情况使用checked和unchecked关键字覆盖默认值.如果您依赖于在一段代码中进行检查,则明确启用它将checked是一个好主意.
int j = checked(i * 2);
checked
{
int j = i * 2;
// Do more stuff
}
Run Code Online (Sandbox Code Playgroud)
请注意,浮点运算从不抛出OverflowException,而十进制运算总是抛出一个OverflowException.另请参见C#运算符.