8

私はこのようなコードを持っています:

int a = 629339;
int b = 4096;
long res = a*b;

結果はです-1717194752 が、longに手動キャストを1つ追加するlong res = ((long)a)*b;long res = (long) a*b;、結果が正しい場合、2577772544 誰がそれがどのように機能するかを説明できます。

4

3 に答える 3

8

何が行われているのかを理解するには、代入ステートメントをその部分に分割する必要があります。

long res = a*b;

ステップ1は、との値を取得することaですb

ステップ2はを評価することa * bです。abは両方ともintsなので、これは乗算intです。したがって、これを掛けると629339629339はになります2577772544。残念ながら、2577772544は可能な最大のJava値よりも大きいintため、乗算演算はサイレントにオーバーフローします...代わりに取得-1717194752します。

ステップ3RHSの値をLHSに割り当てます。RHSはintであり、LHSはfloatであるため、JLSは、プリミティブな拡大変換を実行すると言います...これは単純に-1717194752同じlong値のになります。次に、拡大された値がに割り当てられresます。


あなたが期待している答えを得るには、long算術を使用して乗算を強制的に実行する必要があります。例えば:

long res = ((long) a) * b;

この場合、aとaの乗算がありlong、これは、をaintに拡張し、乗算を実行することによって処理されます。これはオーバーフローしなくなりました(最大値を大幅に下回っているため)。したがって、最終的に値をに割り当てると、予想していた数値になります。intlonglong2577772544longres

于 2012-10-12T15:21:47.077 に答える
7

a*bは整数であり、長さではありません。

これは整数にすぎないため、すでに32ビットの制限を回避しています。
この整数をlongにキャストし直しても、そのデータは魔法のように回復されません。

于 2012-10-12T15:04:16.020 に答える
5
long res = a*b;

a*bキャストの最後(または)に「l」を追加しない限り、整数として扱われます。

Javaチュートリアルによる

intデータ型は、32ビットの符号付き2の補数整数です。最小値は-2,147,483,648、最大値は2,147,483,647(両端を含む)です。整数値の場合、他の何かを選択する理由(上記のような)がない限り、通常、このデータ型がデフォルトの選択です。

于 2012-10-12T15:04:57.213 に答える