2016-05-24 19 views
1

私は長い2つの整数をJavaで結合しようとしています。ここで私が使用しているコードは次のとおりです。Java、2つの整数を長い結果に結合する負の数

Long combinedValue = (long) a << 32 | b; 

a = 0x03b = 0x1B56 ED23、私は期待値(ロングでcombinedValue = 13343583523)を取得することができています。

a = 0x00b = 0xA2BF E1C7の場合、2730484167ではなく、-1567628857の負の値が得られます。誰もが整数0を32ビットシフトすると最初の32ビットが0xFFFF FFFFになる理由を説明できますか?

おかげ

+1

'combinedValue'に' Long'の代わりに 'long'を使います。 –

答えて

3

bも、否定的です。それが定数が意味するものです。おそらくとなります。((long) a << 32) | (b & 0xFFFFFFFFL)です。 bintであれば操作は、同じ型の2つの値の間で行われなければならないので、あなたOR b(long) a << 32が、それはlongに昇格されます

+0

'a'を最初に長くキャストしたくないですか? –

+0

@MaartenBodewesが修正されました。 –

3

。これは拡大変換と呼ばれます。

intからlongにこの変換が起こる

bは上部ビットが設定されている場合、それは、64ビット長の値の最上位32ビットにコピーされることを意味し、符号拡張されるであろう。これは、上位32ビットが 0xffffffffになる原因です。

関連する問題