C#中的int没有溢出异常?

eri*_*ric 58 c# overflow

我在Project Euler(顺便说一句很棒的网站)上遇到了第10个问题的奇怪经历.任务是计算低于200万的所有素数之和.

我使用了一个int作为总和,我的算法产生了答案,但是当我粘贴它来验证答案时,它是错误的.

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

当我把类型改为long时,一切都很笨拙.

Kon*_*lph 90

默认情况下,C#整数操作在溢出时不会抛出异常.您可以通过项目设置或进行计算来实现checked:

int result = checked(largeInt + otherLargeInt);
Run Code Online (Sandbox Code Playgroud)

现在操作将抛出.

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

  • "显然,这只有在项目设置中启用了检查操作时才有意义." ...或者你想在`checked`上下文中评估`unchecked`表达式.你当然可以嵌套块. (8认同)
  • 不.发生这种情况时,我在调试模式下运行. (7认同)

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)

希望对你有帮助... :)

  • 选项1是许多人不知道的症结所在.你得到我的+1. (2认同)

And*_*air 7

我已经添加了一个cmt,但对于你们中的一些人来说这可能很有趣:

msdn告诉我们:

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

十进制算术溢出始终抛出OverflowException.

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


Tho*_*rin 6

默认情况下,C#不检查整数上的算术溢出.您可以使用/checked 编译器选项或在Visual Studio中启用"检查算术溢出/下溢"(项目属性 - 构建 - 高级)来更改此设置.

您可以根据具体情况使用checkedunchecked关键字覆盖默认值.如果您依赖于在一段代码中进行检查,则明确启用它将checked是一个好主意.

int j = checked(i * 2);

checked
{
    int j = i * 2;
    // Do more stuff
}
Run Code Online (Sandbox Code Playgroud)

请注意,浮点运算从不抛出OverflowException,而十进制运算总是抛出一个OverflowException.另请参见C#运算符.