请考虑以下代码。前5次迭代进展顺利,然后继续发送垃圾邮件0的无限循环。
for (int i = 2; i < 100000; i*=i)
{
Console.WriteLine(i);
}
我怀疑它是因为Integer溢出,并且猜测溢出时的默认返回值是0.
您如何编写此代码,以便它能够执行预期的操作?
编辑:这是一个理论上的例子,我只是在玩耍来学习。在没有更改数据类型或检查0的情况下,有没有办法做到这一点?如果它真的抛出异常会很好。
答案 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);
}
}
否则使用long
或ulong
代替int
,因为这两者都可以安全地存储100000 * 100000的结果
答案 1 :(得分:3)
如果您想要溢出异常,请使用checked
:
checked
{
for (int i = 2; i < 100000; i*=i)
{
Console.WriteLine(i);
}
}
checked关键字用于显式启用溢出检查 积分型算术运算和转换。
默认情况下,仅包含常量值的表达式会导致a 如果表达式生成一个超出的值,则编译错误 目的地类型的范围。如果表达式包含一个或多个 非常量值,编译器不检测溢出。