for循环中的整数溢出导致奇怪的行为

时间:2014-10-11 19:38:50

标签: c# for-loop integer-overflow

请考虑以下代码。前5次迭代进展顺利,然后继续发送垃圾邮件0的无限循环。

        for (int i = 2; i < 100000; i*=i)
        {
            Console.WriteLine(i);
        }         

我怀疑它是因为Integer溢出,并且猜测溢出时的默认返回值是0.

您如何编写此代码,以便它能够执行预期的操作?

编辑:这是一个理论上的例子,我只是在玩耍来学习。在没有更改数据类型或检查0的情况下,有没有办法做到这一点?如果它真的抛出异常会很好。

2 个答案:

答案 0 :(得分:3)

我相信你说它是正确的。

而不是仅仅告诉您使用unchecked强制它抛出异常,这里解释为什么在第5次结果后得到零

这是系列:

2
4
16
256
65536
4294967296  <-  this won't fit into an int 

在您的代码中,2,147,483,648 + 1变为-2,147,483,648

第6个值溢出并变为0(4,294,967,296结束从0到2,147,483,648到-2,147,483,648并继续向0添加回来)

然后您的for修饰符子句将无限期地运行0*=0

编辑:根据您的更新,使用checked关键字获取溢出异常

 checked {

    for (int i = 2; i < 100000; i*=i)
    {
        Console.WriteLine(i);
    } 

  }  

否则使用longulong代替int,因为这两者都可以安全地存储100000 * 100000的结果

答案 1 :(得分:3)

如果您想要溢出异常,请使用checked

checked
{
    for (int i = 2; i < 100000; i*=i)
    {
        Console.WriteLine(i);
    }   
}
  

checked关键字用于显式启用溢出检查   积分型算术运算和转换。

     

默认情况下,仅包含常量值的表达式会导致a   如果表达式生成一个超出的值,则编译错误   目的地类型的范围。如果表达式包含一个或多个   非常量值,编译器不检测溢出。