C#中的int没有溢出异常?
我在(顺便说一句,很棒的网站)上有过关于第10个问题的奇怪经历。任务是计算200万以下的所有素数之和 我用了一个int作为和,我的算法产生了一个答案,但是当我粘贴它来验证答案时,它是错误的 结果是结果太大,无法放入int,但这不会导致溢出错误或其他什么吗?相反,它只是返回了一个与实际答案相去甚远的值 当我将类型更改为long时,一切都很顺利。C#默认情况下,整数操作不会在溢出时引发异常。您可以通过项目设置或选中计算来实现这一点:C#中的int没有溢出异常?,c#,overflow,C#,Overflow,我在(顺便说一句,很棒的网站)上有过关于第10个问题的奇怪经历。任务是计算200万以下的所有素数之和 我用了一个int作为和,我的算法产生了一个答案,但是当我粘贴它来验证答案时,它是错误的 结果是结果太大,无法放入int,但这不会导致溢出错误或其他什么吗?相反,它只是返回了一个与实际答案相去甚远的值 当我将类型更改为long时,一切都很顺利。C#默认情况下,整数操作不会在溢出时引发异常。您可以通过项目设置或选中计算来实现这一点: int result = checked(largeInt + o
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#(和其他语言)在默认情况下会做一些被称为“整数提升”的厚颜无耻的事情。两个字节相加的结果是一个整数。如果直接打印,结果可能大于字节中的大小。您需要将其重新分配给一个字节(或强制转换)以截断它。这是有道理的,因为小数主要用于货币或科学计算,您可能宁愿让它们抛出,然后默默地失败。