Maison >Java >javaDidacticiel >Pourquoi la conversion Int-to-Byte de Java génère-t-elle une valeur négative ?

Pourquoi la conversion Int-to-Byte de Java génère-t-elle une valeur négative ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-08 13:35:02213parcourir

Why Does Java's Int-to-Byte Conversion Result in a Negative Value?

Comportement inattendu dans la conversion Java Int-to-Byte

Lors de la conversion d'un entier (int) en un octet (byte) en Java, des résultats inattendus peuvent survenir. Considérez le code suivant :

int i = 132;

byte b = (byte) i;
System.out.println(b);

Étonnamment, la sortie n'est pas 132 mais plutôt -124. Pour comprendre pourquoi, nous devons nous plonger dans la représentation interne des types primitifs en Java.

Nombres signés et complément à deux

En Java, les entiers sont signés 32 bits des entiers, tandis que les octets sont des entiers signés de 8 bits. Un entier signé peut représenter à la fois des valeurs positives et négatives en utilisant la notation complément à deux. Dans cette notation, le bit le plus à gauche (MSB) détermine le signe du nombre, 0 indiquant positif et 1 indiquant négatif.

Conversion d'int en octet

Quand lors de la conversion de int en octet, Java conserve le bit de signe et supprime les 24 bits restants. Cela signifie que si la valeur int était positive, la valeur d'octet résultante sera également positive. Cependant, si la valeur int était négative, comme dans notre exemple, la valeur d'octet résultante apparaîtra négative.

L'inversion du complément à deux

Pour comprendre ce comportement négatif, nous devons considérer le processus d'inversion du complément à deux. Pour représenter un nombre négatif, le complément à deux inverse tous les bits et ajoute 1 au résultat. Dans notre cas, la valeur int 132 est 10000100 en binaire. Inverser les bits et ajouter 1 nous donne 01111011, soit -124 en notation décimale.

Valeurs d'octet non signées

Dans notre exemple, nous nous attendons généralement à ce que la valeur d'octet soit ne soit pas signé, ce qui nous donnerait une valeur positive de 132 au lieu de -124. Pour obtenir la valeur non signée de l'octet, nous pouvons appliquer un masque de bits qui supprime le bit de signe et extrait uniquement les 8 bits inférieurs.

byte signedByte = -124;
int unsignedByte = signedByte & 0xff;

System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte);

Cela affichera "Signé : -124 Non signé : 132", donnant nous la valeur non signée souhaitée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn