迭代直到达到int.MaxValue

时间:2013-01-08 14:54:50

标签: c# console-application

作为一个小测试,我想看看在C#控制台应用程序中计算int.MaxValue需要多长时间。每隔几个小时我检查一下进度。昨天晚上,当我认为程序将执行时,它正在执行回到0.我不确定为什么会发生这种情况,我想知道是否有人可以向我解释。它的作用是它计算到2,147,483,647然后当达到这个值时它开始向后计数到零。虽然它看起来倒数,但价值却是负数。我想知道我是否需要使用int.MaxValue的绝对值。无论如何,如果有人能看到我没看到的东西,我只是好奇。这是我的代码。感谢

static void Main(string[] args)
    {
        int maxInt = int.MaxValue;
        int numToCountTo = maxInt;
        //int numToCountTo = 1000000;

        try
        {
            Console.WriteLine(DateTime.Now);
            Console.WriteLine("Press any key to begin.");
            Console.ReadLine();

            Stopwatch sw = new Stopwatch();
            sw.Start();

            for (int counter=0; counter <=numToCountTo ; counter++)
            {

                Console.WriteLine(counter);

            }


            sw.Stop();
            TimeSpan ts = sw.Elapsed;

            // Format and display the TimeSpan value.
            string elapsedTime = String.Format("{0:00 Hours}, {1:00 Minutes}, {2:00 Seconds}, {3:00 Milliseconds}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);

            // ("#,#") places a comma between every 3 digits
            Console.WriteLine("It took " + elapsedTime + " to count to " + numToCountTo.ToString("#,#"));
            Console.WriteLine("Press Enter key to continue.");
            Console.ReadLine();
        }
        catch (Exception ex)
        { 
            throw new Exception("Exception Reached: " + ex.Message)
        }
    }

4 个答案:

答案 0 :(得分:9)

你的for循环:

for (int counter=0; counter <=numToCountTo ; counter++)

不正确。它将在counter <= int.MaxValue执行时始终为true。当它递增时,它将滚动到int.MinValue并继续递增。

将其更改为

for (int counter=0; counter < numToCountTo ; counter++)

或使用long作为循环计数器:

for (long counter=0; counter <= numToCountTo ; counter++)

您还可以使用do...while循环,因为在评估破坏条件之前执行循环

int counter = 0;
do
{
   ...
   counter++;
}
while(counter < numToCountTo);

答案 1 :(得分:7)

它会继续,因为counter永远不会是&gt;如果int.MaxValue int.MaxValue+1,则int.MinValue会缩短为for

因此,您的long条件始终为真。

我建议的替代方法是为您的计数器使用更大的数据类型,如int counter = -1; for(;;) // while(true) { counter++; Console.WriteLine("{0}", counter); if (counter == int.MaxValue) { break; } } ,或将您的循环更改为:

{{1}}

答案 2 :(得分:1)

它被称为溢出 - 整数包围到可能的最低负值。

如果您希望它停在maxInt,则应将<=替换为< - 目前您永远无法停止循环,因为counter永远不会更大可以maxIni

答案 3 :(得分:1)

当您向Int32.MaxValue添加1时,您最终会得到Int32.MinValue

int a = Int32.MaxValue;
a++; // a is now -2147483648