2

作为一个小测试,我想看看在 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

4 回答 4

10

你的 for 循环:

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

是不正确的。它将在counter <= int.MaxValue始终为真时执行。当它增加时,它将滚动到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);
于 2013-01-08T14:59:01.303 回答
7

它将继续,因为counter永远不会 > than 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;
    } 
}
于 2013-01-08T14:58:26.450 回答
1

这称为溢出 - 整数环绕到可能的最低负值。

如果你想让它停下来,maxInt你应该用 - 替换<=-<目前你永远不能停止循环,因为counter永远不可能更大maxIni

于 2013-01-08T14:58:39.323 回答
1

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

int a = Int32.MaxValue;
a++; // a is now -2147483648
于 2013-01-08T15:00:55.663 回答