2011-03-09 5 views
3

C#デバッガのウォッチウィンドウに174 * 256 * 256 * 256を入力すると、結果は
-1375731712になります。私はそれが256と何か関係があると思っていますが、ちょっとした指導に感謝します。C#用Visual Studioデバッガでの乗算問題

ありがとうございます!

+0

整数オーバーフローが原因です。 – BoltClock

+0

これは、整数オーバフローと関係があると思います。これで私を引用しないでくださいが、ウォッチウィンドウのデフォルトの整数型は32ビットである可能性があります。この制限のため、乗算は最大値を超え、ネガにオーバーフローしてしまいます。 – invalidsyntax

+1

@invalidsyntax:ウィンドウのデフォルトではなく、言語のデフォルトです。装飾されていない整数リテラルは、C#でInt32として解釈されます。 –

答えて

0

これを入力してください:

174 * 256 * 256 * 256f 

ので、結果はなく、floatとして整数にキャストされません。

4

いいえ、256とは関係ありません。それは、その乗算が可能な最大符号付き32ビット整数よりも大きいので、オーバーフローが発生します。

この代わりに試してください。

174L * 256L * 256L * 256L 

は、それらは、64ビット整数リテラルです。

+0

興味深い:なぜ例外はスローされないのですか? –

+0

@Mike C .:整数乗算はプロセッサレベルの命令であり、非常に高速です。オーバーフローのチェックは、そのような低レベルの操作では非常に高価になります。任意のサイズまたは任意の精度を持つ数式には、固定サイズを持たないデータ型が必要です。これは、しばしば「Big」と呼ばれます。 –

+5

@Mike C:整数演算がC#プログラムのオーバーフローで例外をスローするようにするには、(1) "x = checked(a * b);"、(2) "checked {x = a * b;}、 (3)コンパイラに "make check the default"スイッチがあります。同様に反対の動作を強制するために "unchecked"があります。 –

0

整数がオーバーフローしています。大きな数字を無制限に使用したい場合は、System.Numerics.BigIntegerを使用できます(利用可能なメモリの横にある)。あなたの特殊なケースでは、longも同様です(64ビット整数)

+0

PS:.NET 4.0で利用可能 – jdehaan

1

オーバーフロー(オーバーフローの原因となるエラー)です。次のように考える:Int32.MaxValue + 1 == Int32.MinValue、ただし乗算がある。

これは、int型は、あなたが整数をあふれているメモリ http://en.wikipedia.org/wiki/Two's_complement

0

で表現される方法を説明します。実際の答えは2,919,235,584ですが、符号付き整数として表すことができるのは2,147,483,647までです。 unsigned int(uint)、long型、ulong型、または十分に大きくない場合を考えてみましょう。ウォッチウィンドウの場合、おそらく最初の引数をキャストするか、接尾辞を使用する必要があります。 174L * 256L * 256L * 256L

0

単純なオーバーフローです。ウォッチウィンドウに次のように入力してください。

(uint)(174 * 256 * 256 * 256) 
関連する問題