2016-05-24 4 views
1

J'essaie de combiner deux entiers à un long en Java. Voici le code que je utilise:Java, combinant deux entiers à long nombre de résultats négatifs

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

Quand a = 0x03 et b = 0x1B56 ED23, je suis en mesure d'obtenir la valeur attendue (dans combinedValue = 13343583523 long).

Cependant, quand mon a = 0x00 et b = 0xA2BF E1C7, je reçois une valeur négative, -1567628857, au lieu de 2730484167. Quelqu'un peut-il expliquer pourquoi le décalage d'un entier de 0 à 32 bits fait que les 32 premiers bits deviennent 0xFFFF FFFF?

Merci

+1

Utilisez 'long' à la place de' Long' pour 'combinedValue'. –

Répondre

3

b est trop négatif,. C'est ce que cette constante signifie. Ce que vous avez probablement besoin est ((long) a << 32) | (b & 0xFFFFFFFFL).

+0

Vous ne voulez pas lancer 'a' longtemps en premier? –

+0

@MaartenBodewes corrigé. –

3

Lorsque vous ou (long) a << 32 avec b, si b est un int alors il sera promu à un long parce que l'opération doit être effectuée entre deux valeurs du même type. C'est ce qu'on appelle une conversion d'élargissement.

Lorsque cette conversion de int à long arrive, b sera prolongée du signe, ce qui signifie que si le bit haut est réglé alors il sera copié dans les 32 bits de la valeur à long 64 bits. C'est ce qui fait que les 32 premiers bits sont 0xffffffff.