2010-08-02 11 views
5

Je veux comprendre comment convertir un nombre signé en unsigned.Comprendre les nombres non signés Java

laisse dire que j'ai ceci:

byte number = 127; // '1111111' 

Afin de le rendre non signé, je dois choisir « plus grand » type de données « court » et appliquer opérateur AND avec la valeur 0x00ff.

short number2; 
number2 = number & 0x00ff; 

Pourquoi le numéro est-il non signé?

Répondre

4

Java n'a pas réellement de primitives non signées.

La valeur 127 est en réalité représentée par '01111111' le premier bit étant le signe (0 est positif). Un octet non signé serait capable de contenir les valeurs 0 à 255, mais 127 est le maximum pour un octet signé.

Depuis un octet a 8 bits, et le signé en consomme un pour tenir le signe. Donc, si vous voulez représenter des valeurs supérieures à 127, vous devez utiliser un type plus grand qui a un plus grand nombre de bits. Le type supérieur a également un bit réservé pour le signe, mais il a au moins 8 bits utilisés pour les valeurs réelles, donc vous pouvez représenter la valeur 255.

Cela étant dit, vous devriez probablement éviter d'utiliser octet et court car il sont des problèmes avec eux. Vous remarquerez que je jette le résultat à court, puisque les opérateurs retournent réellement int. Vous devriez juste coller à int et long en java car ils sont mieux mis en œuvre. Edit: l'opérateur AND le rend non signé puisque le bit de signe est le premier bit du short, et vous copiez les 8 bits contenant la valeur de l'octet sur les 8 derniers bits du short. Donc, si vous avez un nombre négatif, le premier bit qui est 1 (c'est-à-dire négatif) devient réellement une partie de la valeur. Et le short sera toujours positif puisque son bit de signe est à deux haut d'une puissance de deux pour être affecté par le short.

byte:    10101101 
        ||||||| <- actual value 
short:  0000000010101101 
      ||||||||||||||| <- actual value 

Edit 2: Prenez note cependant que, puisque les valeurs négatives utilisent two's complement representation la valeur pourrait ne pas être ce que vous attendez. toutes les valeurs positives restent les mêmes.
Mais -128 = 0x10000000 deviendra 128
-127 = 0x10000001 deviendra 129
et ainsi de suite jusqu'à -1 = 0x11111111 qui deviendra 255

+0

Aucun lien pour les problèmes sur les octets et les courts? J'ai utilisé octet de temps en temps, mais jamais vraiment utilisé court. –

+0

@DeanJ: Je pense que le problème est la performance car vous avez besoin de plus de conversions car de nombreuses opérations renvoient int. – Cloudanger

+0

Le premier exemple illustre le point: http: //blog.mpathirage.com/2010/06/27/java-puzzlers-phantom-référence-menace-attaque-du-clone-vengeance-du-shift/Si vous utilisez un opérateur sur le court comme + ou - il se transforme en un int et qui peut causer des problèmes lors de l'appel de méthodes surchargées. –

1

java n'a pas de type de données non signé. Vous venez de passer à un type de données "plus grand", c'est tout.

+0

J'ai demandé comment il est non signé – shlomjmi

+0

cette opération ET il ne rend le type non signé. Le maximum que vous pouvez atteindre avec la magie de décalage est de jeter moins. Mais cela ne fait pas de type non signé. Quoi qu'il en soit, comment pensez-vous que cela se passe? Bitshifting crée accidentellement une nouvelle sous-classe ou des hacks dans JVM? – foret

0

Si vous passez simplement d'un octet négatif à int, l'int sera également négatif. Sou vous prenez le négatif int (ou court dans votre exemple) et définissez le plus haut 3 octets (int) à 0x00.

Questions connexes