以下是一段代码:
{
int counter = 1;
try
{
while (true)
counter*=2;
}
catch (Exception)
{
Console.WriteLine(counter);
Console.ReadLine();
}
}
当我运行此代码时,经过几次迭代后,'counter'的值变为0。 我不明白为什么会这样?
答案 0 :(得分:10)
使用checked
抛出溢出异常:
checked {
int counter = 1;
try {
while (true)
counter *= 2;
}
catch (Exception) { // Actually, on integer overflow
Console.WriteLine(counter);
Console.ReadLine();
}
}
编辑:发生了什么。
事实:整数乘法乘 2 等于左移 1 ,即
counter * 2 == counter << 1
在您的情况下(让counter
表示为二进制)
00000000000000000000000000000001 // initial, just 1
00000000000000000000000000000010 // 1st itteration (shifted by 1)
00000000000000000000000000000100 // 2nd itteration (shifted by 2)
...
10000000000000000000000000000000 // 31st itteration (shifted by 31)
接下来,第32次itteration可能会导致整数溢出或何时
unchecked
只需将最左边的1推出
0000000000000000000000000000000 // 32nd itterartion, now we have 0
答案 1 :(得分:3)
当计数器到达int.MaxValue时,计数器* 2变为负整数。
然后当计数器达到int.MinValue时,计数器* 2变为0。
然后在每次迭代时你都有0 * 2 = 0,没有抛出异常。