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ループカウンターに a を使用します。

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> になることは決してないので、それは続きint.MaxValueます。int.MaxValue+1int.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

に1を追加すると、Int32.MaxValueで終わりますInt32.MinValue

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

これはオーバーフローと呼ばれます - 整数は可能な限り低い負の値にラップアラウンドします。

で停止したい場合は、 を- にmaxInt置き換える必要があります。現時点では、ループを停止することはできないため、これ以上大きくすることはできません。<=<countermaxIni

于 2013-01-08T14:58:39.323 に答える