2017-08-16 13 views
2

どのようにして整数オーバーフローを起こすことができますか? C#でオーバーフロー例外をキャッチすることは可能ですか?なぜC言語でint limitをバイパスできますか

私が使用したC#コード:

int overflow = 1; 

for (int i = 0; i < 31; i++) { 
    overflow = overflow * 2; 
    Console.WriteLine(overflow); 
} 

プログラムは、私は1つ(でも複数回)で、整数の値を上げたときに正常にカウントしていきます。

for (int j = 0; j < 10; j++) { 
    overflow++; 
    Console.WriteLine(overflow); 
} 

しかし、ときに私それを2倍に増やし続けると、常にゼロで応答します。

どうしてですか?

+1

"Windowsはこれを防止してはいけませんか?" Windowsにはこの責任があると思いますか? –

答えて

3

デフォルトでは、非定数式は実行時にオーバーフローがチェックされず、オーバーフロー例外が発生しません。

オーバーフローチェックは、コンパイラオプション、環境設定、またはユーザのキーワードで有効にすることができます。 キーワードをチェックすると、整数型の算術演算と変換に対してオーバーフローチェックが明示的に有効になります。

ここでチェックキーワード魔女とあなたのコードオーバーフロー例外をスロー:

checked 
{ 
    int overflow = 1; 

    for (int i = 0; i < 31; i++) 
    { 
     overflow = overflow * 2; 
     Console.WriteLine(overflow); 
    } 
} 

checked (c# Reference)

0

を "Windowsはこれを防ぐべきではないでしょうか"

あなたのintはその限界以上になったときにエラーを投げるとき、それはちょっとない:

オーバーフロー:-2147483648

int.MaxValue:

あなたはint型を取得したい場合は2147483647(またはint32)が2147483647を超える場合は、おそらくint64を使用するべきです: https://msdn.microsoft.com/en-us/library/system.int64(v=vs.110).aspx

またはbigintegerについては、

https://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx

関連する問題