Octets non signés en Java
Octets en Java sont signés par défaut. Je vois sur d'autres posts qu'une solution de contournement pour avoir des octets non signés est quelque chose de similaire à: int num = (int) bite & 0xFF
Quelqu'un pourrait-il m'expliquer pourquoi cela fonctionne, et la convertit en un octet signé pour un octet non signé, puis son entier? ANDing
un octet avec 11111111 résultats dans le même octet - droit?
source d'informationauteur darksky
Vous devez vous connecter pour publier un commentaire.
Un transtypage a une priorité plus élevée que les
&
de l'opérateur. Par conséquent, vous êtes le premier casting pour un int, alors ANDing afin de masquer tous les bits de poids fort sont définies, y compris le "bit de signe" du complément à deux de la notation de java utilise, vous laissant avec seulement la valeur positive de l'original de l'octet. E. g.:et vous avez effectivement enlevé le signe de l'original de l'octet.
Sauf que vous êtes ANDing avec 00000000000000000000000011111111, parce que 0xFF est un
int
littérale - il n'y a pasbyte
littéraux en Java. Donc ce qui se passe est que lebyte
est promuint
(le transtypage est inutile), a son signe étendu (c'est à dire la garde, éventuellement, la valeur négative de labyte
mais alors le signe de l'extension est revenue par la ANDing avec tous ces zéros. Le résultat est unint
qui a comme moins importantes bits exactement l'ancienbyte
et donc la valeur de labyte
aurait eu l'étaient pas signés.Dans Java 8 une telle méthode est apparue dans l'Octet de classe:
Comme vous le voyez le résultat est un
int
pas un octetComment il fonctionne, disons que nous avons un
byte b = -128;
c'est représentée comme1000 0000
donc ce qui se passe lorsque vous exécutez votre ligne? Nous allons utiliser un temp int par ce, de dire:int i1 = (int)b;
i1 est maintenant -128 et c'est d'ailleurs représenté en binaire, ressemble à ceci:Donc, ce n'est
i1 & 0xFF
ressembler en binaire?qui résultats dans
et c'est exactement 128, ce qui signifie que votre valeur signée converti à pas signé.
Modifier
Convertint octet
-128 .. 127
en0 .. 255
Vous ne peut pas représenter les valeurs de 128 à 255 à l'aide d'un octet, vous devez utiliser quelque chose d'autre, comme un int ou un smallint.
Oui, mais de cette façon, vous pouvez être sûr que vous n'obtiendrez jamais un nombre >255 ou <0.
Si le premier bit est à 1, le nombre est négatif. Si vous convertissez byte int, si elle est négative, elle sera pré-entrée avec 1 octets, et si elle est positive, avec 0 octets. L'exécution de la routine et tomberont tous les octets à gauche de la première 8. Cet effet ajoute 256 négatif octets.