为什么C#编译器没有抛出任何错误?

时间:2015-05-20 15:19:21

标签: c#

以下是一段代码:

    {
        int counter = 1;
        try
        {
            while (true) 
                counter*=2;
        }
        catch (Exception)
        {
            Console.WriteLine(counter);
            Console.ReadLine();
        }
    }

当我运行此代码时,经过几次迭代后,'counter'的值变为0。 我不明白为什么会这样?

2 个答案:

答案 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,没有抛出异常。