5

私はこれに本当に困惑しています。私はWindowsPhone7.5用のC#でコーディングしています。テキストボックスからテキストを取得し、それを配列に解析してから、Convert.ToInt32を使用して各配列要素をInt32に変換し、一連の数学的計算を通じて結果のInt32値を実行し、Int32値を乗算してハードコードされた数値に加算します。 (すべてUIで選択されているものに依存します)。

結果の計算を取得してそれらを乗算するまでは、すべて問題ありません。2つの正の数を乗算すると、負の数が得られます。Convert.ToInt32関数を使用するメソッドで発生した両方の数値を使用して計算を行うのは、これが唯一の場合です。それらを足したり、引いたり、あるいは割ったりすると、数学は正しく出てきます。しかし、それらが乗算されるとき、サイコロはありません。数学は完全に間違っています。LibreOffice Calcで計算を再確認しましたが、一致しません。コードをステップスルーするとき、Convert.ToInt32関数を使用するメソッドで発生した数値が乗算されるまで、すべてが正しくなります。何か案は?

4

3 に答える 3

16

数はおそらくオーバーフローするのに十分な大きさInt32.MaxValueです。

検討:

var r = Int32.MaxValue / 2;     // r = 1073741823
var ans = r * 3;                // ans = -1073741827

この理由は、負の整数は1最大ビットでaで表されるため、最大値よりも大きい乗算は1この位置にあり、これは負の値として解釈されます。

オーバーフローはint、すべてshortの整数型(、、、、、、、、、、、および)でbyte危険です。またはのような浮動小数点型を使用できますが、これには、丸めや等式の問題などの他の問題が伴います。期待する数値の種類を知っている必要があります。次に、、、またはのような浮動小数点型を使用する場合があります。最終的に、何が起こるかわからない場合は、入力にガードコードを記述し(たとえば、ブロックでラップする[thanks、@EricLippert]、それが範囲外の値である場合に処理する必要があります。のために設計されました。sbytecharlongulongushortuintfloatdoublelonguintulongdoubledecimalchecked { }

編集:.Net 4.0+のもう1つのオプションは、を使用することSystem.Numerics.BigIntegerです。これにより、オーバーフローは回避されますが、速度が低下する可能性があります。

于 2013-03-09T20:14:49.583 に答える
3

手っ取り早い解決策は、値の1つをalongにキャストしてから、可能であれば結果をにキャストするintことです。

編集:オーバーフローすることはないBigIntegerため、この場合に使用する必要はありません。int x intlong

于 2013-03-09T20:17:18.110 に答える
0

おそらく整数オーバーフロー例外です。十分な大きさの変数に数値を格納している場合でも発生する可能性があります。例(long、doubleなど)

int one = int.MaxValue;
int two = int.MaxValue;

long sum = (long)(one + two); //Returns -2, because the cast was after the sum
                             //(long) -2.

合計の前にそれらをキャストして、正しい結果を得ることができます

int one = int.MaxValue;
int two = int.MaxValue;

long sum = (long) one + (long)two; //Returns 4294967294, it casts both the 
                                   //integer to long and then adds them 
于 2016-06-25T15:51:11.433 に答える