Maison > Java > javaDidacticiel > Pourquoi la conversion d'un int en octet en Java donne-t-elle une valeur négative, et comment pouvons-nous récupérer la valeur originale non signée ?

Pourquoi la conversion d'un int en octet en Java donne-t-elle une valeur négative, et comment pouvons-nous récupérer la valeur originale non signée ?

Susan Sarandon
Libérer: 2024-11-09 09:10:02
original
902 Les gens l'ont consulté

Why does converting an int to a byte in Java result in a negative value, and how can we retrieve the original unsigned value?

Anomalies intrigantes de conversion d'int et d'octets

Lors de la conversion d'un int en octet en Java, le comportement peut sembler inattendu, en particulier si l'on considère l'apparent perte de données et le signe négatif attribué à l'octet résultant. Pour résoudre cette énigme, explorons les subtilités des types de données primitifs et de la représentation en complément à deux.

Comprendre les types primitifs et le complément à deux :

En Java, un int occupe 32 bits, alors qu'un octet n'occupe que 8 bits. De plus, les types primitifs comme int et byte suivent la représentation du complément à deux. Dans ce schéma, le bit le plus élevé (MSB) détermine le signe et des bits supplémentaires conduisent à sa réplication.

Conversion bit à bit d'int en octet :

Lors de la conversion d'un int en un octet, Java extrait uniquement les 8 bits les moins significatifs et attribue la valeur en conséquence. Cependant, le MSB d'un int, désormais le bit de signe de l'octet, joue un rôle important dans le résultat.

Révéler la vérité cachée :

Disséquons notre exemple déroutant :

int i = 132;

byte b = (byte)i; // Implicit narrowing conversion

System.out.println(b); // Prints -124
Copier après la connexion

La représentation binaire 32 bits de 132 :

00000000000000000000000010000100
Copier après la connexion

Extraction des 8 bits les moins significatifs (10000100) :

10000100
Copier après la connexion

Conversion en représentation en complément à deux :

11111000
Copier après la connexion

Java interprète cela comme un valeur négative en raison de la configuration binaire inversée, ce qui fait que -124 est imprimé.

Résoudre l'énigme :

Pour récupérer la valeur originale non signée de 8 bits de l'octet, nous pouvons effectuer une opération ET au niveau du bit :

byte signedByte = -124;
int unsignedByte = signedByte & 0xff; // 0xff = 11111111b
Copier après la connexion

Cette opération masque les bits de signe superflus, donnant ce qui suit résultat :

Unsigned value: 10000100 (84 in decimal)
Copier après la connexion

Résumé de la supercherie :

Lors de la conversion entier en octet, Java ignore les 24 bits les plus à gauche via un rétrécissement implicite. Le bit de signe, à l'origine le 8ème bit de l'int, devient le MSB dans l'octet, influençant son interprétation. Pour dévoiler la valeur non signée, une opération ET au niveau du bit est nécessaire, effaçant efficacement les bits de signe.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal