C#デバッガのウォッチウィンドウに174 * 256 * 256 * 256を入力すると、結果は
-1375731712になります。私はそれが256と何か関係があると思っていますが、ちょっとした指導に感謝します。C#用Visual Studioデバッガでの乗算問題
ありがとうございます!
C#デバッガのウォッチウィンドウに174 * 256 * 256 * 256を入力すると、結果は
-1375731712になります。私はそれが256と何か関係があると思っていますが、ちょっとした指導に感謝します。C#用Visual Studioデバッガでの乗算問題
ありがとうございます!
これを入力してください:
174 * 256 * 256 * 256f
ので、結果はなく、floatとして整数にキャストされません。
いいえ、256とは関係ありません。それは、その乗算が可能な最大符号付き32ビット整数よりも大きいので、オーバーフローが発生します。
この代わりに試してください。
174L * 256L * 256L * 256L
は、それらは、64ビット整数リテラルです。
興味深い:なぜ例外はスローされないのですか? –
@Mike C .:整数乗算はプロセッサレベルの命令であり、非常に高速です。オーバーフローのチェックは、そのような低レベルの操作では非常に高価になります。任意のサイズまたは任意の精度を持つ数式には、固定サイズを持たないデータ型が必要です。これは、しばしば「Big」と呼ばれます。 –
@Mike C:整数演算がC#プログラムのオーバーフローで例外をスローするようにするには、(1) "x = checked(a * b);"、(2) "checked {x = a * b;}、 (3)コンパイラに "make check the default"スイッチがあります。同様に反対の動作を強制するために "unchecked"があります。 –
整数がオーバーフローしています。大きな数字を無制限に使用したい場合は、System.Numerics.BigInteger
を使用できます(利用可能なメモリの横にある)。あなたの特殊なケースでは、long
も同様です(64ビット整数)
PS:.NET 4.0で利用可能 – jdehaan
オーバーフロー(オーバーフローの原因となるエラー)です。次のように考える:Int32.MaxValue + 1 == Int32.MinValue、ただし乗算がある。
これは、int型は、あなたが整数をあふれているメモリ http://en.wikipedia.org/wiki/Two's_complement
で表現される方法を説明します。実際の答えは2,919,235,584ですが、符号付き整数として表すことができるのは2,147,483,647までです。 unsigned int(uint)、long型、ulong型、または十分に大きくない場合を考えてみましょう。ウォッチウィンドウの場合、おそらく最初の引数をキャストするか、接尾辞を使用する必要があります。 174L * 256L * 256L * 256L
単純なオーバーフローです。ウォッチウィンドウに次のように入力してください。
(uint)(174 * 256 * 256 * 256)
整数オーバーフローが原因です。 – BoltClock
これは、整数オーバフローと関係があると思います。これで私を引用しないでくださいが、ウォッチウィンドウのデフォルトの整数型は32ビットである可能性があります。この制限のため、乗算は最大値を超え、ネガにオーバーフローしてしまいます。 – invalidsyntax
@invalidsyntax:ウィンドウのデフォルトではなく、言語のデフォルトです。装飾されていない整数リテラルは、C#でInt32として解釈されます。 –