为了账号安全,请及时绑定邮箱和手机立即绑定

请问 C#中的int是否没有溢出异常?

请问 C#中的int是否没有溢出异常?

C#
慕标5832272 2019-11-03 08:04:55
我在Euler项目(顺便说一句,很棒的网站)上遇到了第10个问题的怪异经历。任务是计算低于200万的所有素数之和。我使用一个整数作为总和,我的算法产生了一个答案,但是当我粘贴它以验证答案时,这是错误的。原来,结果太大而无法放入int中,但这是否会导致溢出错误或其他原因?相反,它只是返回了一个与实际答案相差很远的值。当我将类型更改为long时,一切都是笨拙的。
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

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


int result = checked(largeInt + otherLargeInt);

现在该操作将抛出。


相反的是unchecked,这使得任何操作都被显式取消。显然,这仅在项目设置中启用了选中的操作时才有意义。



查看完整回答
反对 回复 2019-11-04
?
波斯汪

TA贡献1811条经验 获得超4个赞

在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);

    }

}       

MSDN更详细地解释:


为了使算术,转换或转换操作抛出OverflowException,该操作必须在检查的上下文中发生。默认情况下,将检查Visual Basic中的算术运算和溢出。在C#中,它们不是。如果操作发生在未经检查的上下文中,则结果将被舍弃,方法是丢弃所有不适合目标类型的高阶位。



查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 420 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信