3

shortJava のデータ型について 1 つ質問があります。短い範囲は -32768 から 32767 の間であることがわかっています。

そのため、範囲を超える 2 つの短い値を追加しようとすると、次のように、想定される合計から正の範囲または負の範囲を 2 倍した値を差し引いた結果になります。

short a = 30000;
a = (short) (a+a);

結果は-5536です。

したがって、計算は32768 + 32768 = 655366000 - 65536 = -5536です。

私はそれが何をするのか知っていますが、なぜこのようにするのかわかりません。

誰かがロジックを説明できますか、またはJavaがこのようにしている理由を説明できますか?

4

4 に答える 4

7

何が起こっているかというと、あなたの番号はラップアラウンドしています。より具体的には、数値 30,000 を取得しました。これは 2 進数では次のようになります。

0111 0101 0011 0000

それ自体に追加して 1 を運ぶと、次のようになります。

1110 1010 0110 0000

(注: 2 進数で数値を 2 で乗算するのは非常に簡単です。すべてのビットを 1 つ左にシフトするだけです。)

short は2 の補数を使用した符号付きの数値です。つまり、左端の 1 は実際にはマイナス記号です。その数値は -5536 を表します。

その数値を再度 2 倍すると、それを表すために 2 バイト以上が必要になります。a には 2 バイトしかないため、式の結果が a に絞り込まれるとshort、余分なビットが削除されます。それを十分に行うと、左端の数字が 0 になります。数値は再び正です。そして最終的に、一番左が 1 になります。数値は再び負になります。最終的に、すべての 0 を数値にシフトします。任意の整数を十分な回数 2 で乗算すると、常に 0 になります (具体的には、N ビットの数値の場合、2 を N 回乗算すると、常に 0 になります)。intshort

a に絞り込んでいない場合shortでも、最終的にはint (33 ビット以上が必要な場合) の桁が不足します。これにより、余分な桁が削除され、整数オーバーフローが発生します。いずれかの引数が の場合も同じことが起こりますが、long65 ビット以上かかります。

于 2012-08-16T15:39:19.557 に答える
4

まず、加法演算子がオペランドに対して2 進数の昇格を実行するため、加算によって short が int に変換されます。

したがって、結果はint tmp = 60000;

その結果は、縮小プリミティブ変換を介して short に変換されます。

符号付き整数から整数型 T への縮小変換では、下位 n ビットを除くすべてのビットが単純に破棄されます。ここで、n は型 T を表すために使用されるビット数です。

つまり60000 = 1110 1010 0110 0000b、short は符号付きなので、最初の 1 は符号であり、2 の補数を使用すると、同等の short 値が得られます。これは -5536 です: 1110 1010 0110 0000=> - 0001 0101 1010 0000(すべてのビットを否定し、1 を追加してマイナス記号を付けます)

于 2012-08-16T15:50:37.603 に答える
3
    0111 0101 0011 0000
  + 0111 0101 0011 0000
  ______________________
    1110 1010 0110 0000 

Javashortは 2 の補数でエンコードされます。2 の補数では、最上位ビットは符号ビットと見なされ、01と負になります。

1110 1010 0110 0000 = -5536 in two's complement
于 2012-08-16T15:39:58.080 に答える
2

これは、データのバイナリ表現に関係しています。ほとんどのシステムでは、2 の補数と呼ばれるものが使用されます。先頭に 0 がある限り、正の数は通常どおりに動作します。

0010 = 2

符号を反転するには、すべての 0 を 1 に置き換え、1 を追加します。

-2 = 1110

では、最大の正の数、たとえば 01111 (バイナリ) に 1 を足すとどうなるでしょうか? 10000 を取得します。これは負の数です (具体的には Int.min_val)。これは、整数がオーバーフローしたときに発生します。

http://en.wikipedia.org/wiki/Two%27s_complement

于 2012-08-16T15:36:41.080 に答える