Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的int没有溢出异常?_C#_Overflow - Fatal编程技术网

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

C#中的int没有溢出异常?,c#,overflow,C#,Overflow,我在(顺便说一句,很棒的网站)上有过关于第10个问题的奇怪经历。任务是计算200万以下的所有素数之和 我用了一个int作为和,我的算法产生了一个答案,但是当我粘贴它来验证答案时,它是错误的 结果是结果太大,无法放入int,但这不会导致溢出错误或其他什么吗?相反,它只是返回了一个与实际答案相去甚远的值 当我将类型更改为long时,一切都很顺利。C#默认情况下,整数操作不会在溢出时引发异常。您可以通过项目设置或选中计算来实现这一点: int result = checked(largeInt + o

我在(顺便说一句,很棒的网站)上有过关于第10个问题的奇怪经历。任务是计算200万以下的所有素数之和

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

结果是结果太大,无法放入int,但这不会导致溢出错误或其他什么吗?相反,它只是返回了一个与实际答案相去甚远的值

当我将类型更改为long时,一切都很顺利。

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

int result = checked(largeInt + otherLargeInt);
现在操作将抛出


相反的是未选中的
,它使任何操作都显式未选中。显然,只有在项目设置中启用了选中操作时,这才有意义。

在C#an中不会引发异常(在VB中,根据默认情况引发异常)

要获得EXPERTION,您必须将代码嵌入选中的
上下文中:

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#中,它们不是。如果手术 在未选中的上下文中发生,则 结果将通过丢弃任何 不适合存储的高阶位 目标类型


我已经添加了一条评论,但对你们中的一些人来说可能会很有趣:

告诉我们:

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

但是

始终存在十进制算术溢出 抛出OverflowException

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

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

您可以使用来逐个替代默认值。如果您依赖于在一段代码中进行检查,那么使用
checked
显式启用它将是一个好主意

int j = checked(i * 2);

checked
{
    int j = i * 2;
    // Do more stuff
}
请注意,浮点操作从不抛出
溢出例外
,十进制操作总是抛出
溢出例外
。另请参见。

这是因为默认情况下,C#不会对整数溢出和下溢引发任何异常。你可以在这里做几件事

选择1

您必须启用go to引发的异常 项目=>属性=>构建选项卡=>高级=>检查算术溢出下溢。(确保勾选该选项)

确保勾选该选项

选择2

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

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

你真的想让每一个整数操作都检查溢出吗?好吧,在这种情况下,舒尔会为我节省一些时间;)在这种情况下,是的。但绝大多数操作不可能溢出。如果编译器能够证明这一点并因此禁用检查,那将很有趣,但我非常怀疑它是否会这样做。除非您处于调试模式,我认为int操作是默认检查的。不。发生这种情况时,我在调试模式下运行。我被纠正了。我确信我的项目Euler projects告诉了我调试模式下的溢出情况:/“显然,只有在项目设置中启用了选中操作时,这才有意义。”。。。或者,您希望在
选中的
上下文中计算
未选中的
表达式。您当然可以嵌套这些块。@NealDavis在
checked
块或表达式中,会抛出
OverflowException
。如果你不关心溢出,不要检查它们。您的校验和示例是一个典型的用例,您不想检查溢出。这通常会滚动(不归零)。但是,请注意,C#(和其他语言)在默认情况下会做一些被称为“整数提升”的厚颜无耻的事情。两个字节相加的结果是一个整数。如果直接打印,结果可能大于
字节中的大小。您需要将其重新分配给一个字节(或强制转换)以截断它。这是有道理的,因为小数主要用于货币或科学计算,您可能宁愿让它们抛出,然后默默地失败。