29

この質問は、 long を int に正しくキャストする方法についてではなく、 intに誤ってキャストするとどうなるかということです。

したがって、このコードを検討してください-

   @Test
    public void longTest()
    {
        long longNumber = Long.MAX_VALUE;
        int intNumber = (int)longNumber; // potentially unsafe cast.
        System.out.println("longNumber = "+longNumber);
        System.out.println("intNumber = "+intNumber);
    }

これにより、出力が得られます-

longNumber = 9223372036854775807
intNumber = -1

ここで、次の変更を加えたとします-

long longNumber = Long.MAX_VALUE - 50;

次に、出力を取得します-

longNumber = 9223372036854775757
intNumber = -51

問題は、long の値がどのように int に変換されるのかということです。

4

1 に答える 1

40

の下位 32 ビットlongが取得され、 に入れられますint

ただし、計算は次のとおりです。

  1. longの値を2^64その値に加えたものとして扱います。したがって-1、2^64 - 1 として扱われます (これは符号なし64 ビット値であり、値が実際にバイナリで表現される方法です)。
  2. 結果を取り、2^32 で mod します。(これは符号なし32 ビット値です。)
  3. 結果が >= 2^31 の場合は、2^32 を引きます。(これは、署名付きの 32 ビット値である Javaintです。)
于 2012-09-19T19:13:46.780 に答える