2012-03-28 4 views
-1

シンプルコード:例外からの負のint番号は単なる数値ではないことを示していますか?確かに

int number = int.MaxValue; 
    number = number+1; 
Console.WriteLine(number); 

質問:

1)OverflowExceptionがあるべきであります。ありません。何故ですか?

  • )上限サイズを超えてどのように多くのバイトです:

    2)は数-2147483648約何かを示していますか?

  • )もし私が-2147483648と表示されている場合は、例外がない場合はどうすれば知ることができますか? - Try Catchでラップしなければならないのですか?

p.s.私が書いたとき:

int number = int.MinValue; 
    number = number-1; 
Console.WriteLine(--number); 

を私が得た:2147483647(まだありません例外)。

+0

@downVoter ....何故ですか? –

答えて

7

オーバーフロー例外があります。ありません。何故ですか?

デフォルトでは、C#ではオーバーフローチェックは行われません。 VS内のビルドタブの[アドバンス]ビット、またはコマンドラインから/checked+のブロック/式を有効にすることができます。

質問の2番目の部分-2147483648はちょうどint.MinValueです。非常に大きな正の数から非常に大きな負の数に転じる符号付き整数があります。例えば

、あなたがsbyte(符号付きバイトタイプ)を使用する場合:

sbyte number = 127; // sbyte.MaxValue 
number++; 
Console.WriteLine(number); // Prints -128 

ここで起こって面白いものは何もありません - それだけで通常の2s complementオーバーフローです。

または例外を取得するにはcheckedブロックで包みbyte(符号なし)

byte number = 255; // byte.MaxValue 
number++; 
Console.WriteLine(number); // Prints 0 
+0

これは、限界サイズを超えたバイト数を示していますか? –

+0

@RoyiNamir:それを編集していた - いいえ、それは全く例外を示していません。オーバーフローの結果だけです。 –

+1

@RoyiNamir:Gah、申し訳ありません - バイトはC#で符号なしです。あなたはsbyteが必要です。編集します。 –

1

を使用。算術オーバーフローはデフォルトではチェックされていません。

1

番号-2147483648がについて何かを示してい:

それは最小値です。オーバーフローするとラップされますので、maxValue+1 == MinValueMaxValue + 2 == MinValue + 1など 他の方向にも同じロジックが適用されます。 MinValue - 1 == MaxValue

1

intは最小値と最大値を持ちます。最大値をあふれている場合は、最小値までサイクルダウンします。

例:

intは10 -10から番号を有するカント のint I = 8。 // 8 i ++; // 9 i ++; // 10 i ++; // -1 i ++; // -9 i - = 2; // 10 i + = 10; // -1

オーバーフロー例外を取得するには、デフォルトでチェックされていないチェックブロックを使用します。

checekd 
{ 
    int i = int.MaxValue; 
    i++; // throws 
} 
関連する問題