Maison  >  Article  >  Java  >  Pourquoi la conversion int en octet de Java produit-elle des valeurs négatives inattendues ?

Pourquoi la conversion int en octet de Java produit-elle des valeurs négatives inattendues ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-07 18:11:03650parcourir

Why Does Java's int to byte Conversion Produce Unexpected Negative Values?

Conversion int-to-byte de Java : comprendre la valeur non signée

En travaillant avec des types primitifs Java, les développeurs ont fréquemment rencontré un problème intrigant comportement lors de la conversion d’un entier (int) en octet (byte). Comme le démontre l'extrait de code ci-dessous, la conversion d'un entier positif en un octet entraîne de manière inattendue une valeur négative apparemment erronée :

int i = 132;
byte b = (byte) i;
System.out.println(b); // Output: -124

Pourquoi la sortie de ce code simple est-elle -124 au lieu du 132 attendu ? Pour percer ce mystère, nous approfondissons les subtilités des types primitifs de Java et la représentation interne des valeurs signées et non signées.

Comprendre les types signés et non signés en Java

Dans Java, les types primitifs comme int, byte, short et long sont signés, ce qui signifie qu'ils peuvent représenter à la fois des valeurs positives et négatives. Ces types utilisent la notation complément à deux, où le bit le plus significatif (MSB) détermine le signe du nombre. Si le MSB est 0, le nombre est positif ; sinon, c'est négatif.

Le rôle du ET au niveau du bit

Pour résoudre la confusion et révéler la véritable valeur non signée de l'octet, nous utilisons des opérations au niveau du bit. Plus précisément, nous utilisons l'opérateur ET au niveau du bit ("&") avec un masque de bits, généralement représenté par 0xff. Le masque de bits garantit que seuls les 8 bits inférieurs de l'entier sont conservés, supprimant ainsi tous les bits de signe.

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

System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte); // Output: Signed: -1 Unsigned: 255

En masquant les bits supérieurs, nous isolons la valeur non signée d'origine de l'octet, révélant qu'il était en effet une valeur positive (255 dans ce cas).

L'impact de la conversion

Lorsque Java convertit un int en octet, il tronque les 24 bits les plus à gauche, laissant seulement les 8 bits inférieurs. L'interprétation de ces bits restants dépend de la présence du bit de signe. Si le bit de signe est 1 (négatif), Java suppose que la valeur est négative et retourne les 7 bits restants. Cependant, si le bit de signe est 0 (positif), les bits restants sont lus comme une valeur non signée.

Conclusion

En comprenant la nature signée des types primitifs de Java et le rôle du masquage de bits, nous pouvons démystifier le comportement apparemment étrange observé lors de la conversion d'entiers en octets. Ces connaissances permettent aux développeurs de manipuler et d'interpréter les données avec précision, garantissant ainsi que leur code Java fonctionne comme prévu.

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