2016-05-24 19 views
1

Ich versuche, zwei Ganzzahlen zu einem langen in Java zu kombinieren. Hier ist der Code Ich verwende:Java, kombiniert zwei ganze Zahlen zu langen Ergebnissen negative Zahl

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

Wenn a = 0x03 und b = 0x1B56 ED23, ich bin in der Lage den erwarteten Wert (combinedValue = 13343583523 in lang) zu erhalten.

Allerdings, wenn meine a = 0x00 und b = 0xA2BF E1C7, bekomme ich einen negativen Wert, -1567628857, anstelle von 2730484167. Kann jemand erklären, warum das Verschieben einer Ganzzahl von 0 um 32 Bits bewirkt, dass die ersten 32 Bits 0xFFFF FFFF werden?

Dank

+1

Verwenden Sie 'long' anstelle von' Long' auch für den 'combinedValue'. –

Antwort

3

b negativ ist, auch. Das ist es, was diese Konstante bedeutet. Was Sie wahrscheinlich wollen ist ((long) a << 32) | (b & 0xFFFFFFFFL).

+0

Willst du nicht 'a' zu lange zuerst? –

+0

@ MaartenBodewes behoben. –

3

Wenn Sie OR (long) a << 32 mit b, wenn b ein int ist, dann wird es zu einem long gefördert werden, da der Betrieb zwischen zwei Werten des gleichen Typs durchgeführt werden muß. Dies wird als Erweiterungskonvertierung bezeichnet.

Wenn diese Umwandlung von int zu long geschieht, Zeichen b wird erweitert, dass er gesetzt ist, wenn das oberste Bit bedeutet dann in die oberen 32 Bits des Long-Wert 64 Bit kopiert werden. Dies bewirkt, dass die oberen 32 Bits 0xffffffff sind.