1

Javaの左ビットシフトが誤った値を返すという問題があります...

たとえば、108<<60とします。答えは次のようになります*:

124515522497539473408

Javaはこの値を返します

-4611686018427387904

このステートメントの場合:

System.out.println(108L << 60L);

なぜ???どちらの値も強制的にlongになります...したがって、ビット値を切り捨てる必要がある理由はわかりません。ここで何が欠けていますか?

*引用:Wolfram Alpha

4

3 に答える 3

4

long(64ビット)の長さを超えてシフトしています。108は7ビットを占めるため、108L << 60L正しく表すには67ビットが必要です。実際には、これは符号付きタイプであるため、負の数として解釈されないようにするには、68ビットが必要になります。

于 2012-04-08T04:41:23.020 に答える
1

108は7ビットなので、<<60は67ビットの数値です。

于 2012-04-08T04:42:08.733 に答える
1

を表す数値108L << 60が大きすぎて、を表すことができませんlong。そのため、オーバーフローが発生し、上位ビットが失われます。

これほど大きな数値を(切り捨てなしで)表現したい場合、最も簡単なのはを使用することBigIntegerです。

ちなみに、シフト演算子の第2オペランドは、である必要はありませんlong。実際のシフトカウントは、オペランドを0〜63の範囲の数値に切り捨てることによって計算されます(longシフトの場合)。JLS15.19を参照してください。

于 2012-04-08T04:50:08.307 に答える