循环中的整数溢出导致异常行为

本文关键字:异常 溢出 整数 循环 | 更新日期: 2023-09-27 18:26:13

请考虑以下代码。前5次迭代进行得很顺利,然后以无限循环的方式发送0。

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

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

你将如何编写这段代码,使其达到预期目的?

编辑:这是一个理论上的例子,我只是四处学习。如果不更改数据类型或检查0,是否没有办法做到这一点?如果它真的抛出了一个异常,那就太好了。

循环中的整数溢出导致异常行为

我相信你说得对,它溢出了。

与其只是告诉你使用unchecked来强制它抛出异常,这里有一个为什么你在第5个结果后得到零的解释

这是系列:

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

在您的代码中,2147483648+1变为-2147483648

第6个值溢出并变为0(4294967296最终从0变为2147483648,再变为-2147483648,并不断向上加至0)

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

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

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

否则,使用longulong而不是int,因为这两种方法都可以安全地存储100000*100000 的结果

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

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

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

默认情况下,仅包含常数值的表达式会导致如果表达式生成的值在目标类型的范围。如果表达式包含一个或多个非常数值,编译器不会检测到溢出。