2

次のコードを検討してください。

System.out.println(1 + 0xFFFFFFFFL);
System.out.println(1L + 0xFFFFFFFF);

最初の行は、期待値 を出力します4294967296。しかし、2 行目は0. 両方の式のタイプを (メソッドに渡すことによって) チェックしたところ、両方ともlongJVM によって認識されました。Lava 7 言語仕様では、二項演算について、「いずれかのオペランドが long 型の場合、もう一方は long 型に変換される」と規定されています。という感じですが、2点質問があります。

  1. 両方のオペランドが long になる場合、最初の式で上位ビットが切り捨てられるのはなぜですか?

  2. なぜ順序が重要なのですか?

4

2 に答える 2

1

デフォルトでは、Java ではすべての数値定数はint.

2 番目の例では、java は2 の補数のバイナリ表現を使用するため、式0xFFFFFFFF-1as でありint、これを a に拡張してもlongas のままです。したがって、ゼロ-1を指定して をコーディングしました。1 + -1

于 2013-09-01T21:09:40.660 に答える