2017-01-26 9 views
1

は、我々は次のループを持っていると仮定しましょう、それ自体で終了します。しかし、私の質問はそれがどれくらいの期間実行されるかということです。私の教授は、intが4 bytes = 32 bitsであるとすれば、-2147483648 to 2147483647からの数値を格納できると言っているからです。これを考えると、forループでは、これらの数値の1つに到達してループがまだ進行中(このように)にプログラムされていれば、数値は正になり、条件は次のようになります。ループを終了する。は、無限ループがこれまで

私の質問はちょうどです:これはどうやって起こりますか? forループで-2147483648の数が+2147483648になるのはなぜですか?forループで+2147483648が-2147483648に変わるのはなぜですか?私は、カウンタが2147483649をヒットするとすぐにセグメンテーション違反が発生すると考えていたからです。あなたの応答に感謝します!

+3

'これは無限のfor-loop'です...疑いなく、ループ条件' i> 2'が決してtrueにならないため、このループは一度も実行されません。 –

+1

無限ループは 'while(true){}'になります。しかし、あなたの質問は本当に整数の算術ではなく、ループではないようです。 – MrEricSir

+0

@TimBiegeleisen私にはこれを確認していただきありがとうございます。私は狂った薬を取っていたと思った。 – mascoj

答えて

2

なぜあなたはビット表現で、あなたの整数を書く場合、これは明らかになり

-2147483648

に2147483647ターンはありません。簡単にするために、charやstd :: int8_tのような8ビット変数を取ることができます。 8ビットタイプは、2^8 = 256の異なる値を保持できます。符号付き変数の場合、これらは-128から127までの値です(0も値なので、最大127までです)。いくつかの例:

0000 0000 = 0 
0000 0001 = 1 
0111 1111 = 127 

1111 1111 = -1 
1111 1110 = -2 
1000 0000 = -128 

あなたが簡単にあなたが例えば計算場合は-1 + = 1 2

1111 1111 
+ 0000 0010 
    1111 11  (carry)  
    --------- 
    0000 0001 

を使用すると、値0111 1111をインクリメントする場合、値が-1 1111 1111にする必要があることがわかります= 127あなたは1000 0000 = -128を得ます。あなたのケースでは何が起こったのかというだけのことです。

しかし、Fantastic氏がすでに述べたように、実際にラップするかどうかは、コンパイラの実装に依存し、標準では定義されていません。

5

タイトル質問に答えるにはWill an Infinite Loop ever end by Itself

号しかし、あなたのループだけで無限ではない、それもあるため、ループ条件のための一回実行されませんではありません。

for (int i = 1; i > 2; i--) 

iでは、1はループ条件i> 2を満たすことはありません。

あなたはi < 2を意味していましたが、その答えは分かりません。整数オーバーフローはC++see here)の未定義の動作です。

これはほとんどの場合ラップアラウンドしますが、動作が定義されていないため、実際に何が起こるかを議論するための実際のポイントはありません。