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