Maison >Java >javaDidacticiel >Pourquoi la conversion d'un « int » en « octet » en Java conduit-elle à un résultat négatif inattendu ?

Pourquoi la conversion d'un « int » en « octet » en Java conduit-elle à un résultat négatif inattendu ?

DDD
DDDoriginal
2024-11-15 08:42:021038parcourir

Why does casting an `int` to a `byte` in Java lead to an unexpected negative result?

Comportement inattendu : interrogation de conversion d'octet Java

En Java, lorsqu'un entier est converti en octet, le résultat inattendu de -124 de l'extrait de code suivant a fait sourciller :

int i = 132;

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

Plonger dans l'Enigme

Pour percer ce mystère, nous devons nous plonger dans les subtilités des types de données primitifs en Java. Les entiers, s'étendant sur 32 bits, et les octets, avec 8 bits, diffèrent par leurs capacités de stockage. La plupart des types primitifs, y compris les octets, sont signés, ce qui signifie qu'ils représentent à la fois des valeurs positives et négatives en utilisant le codage en complément à deux.

Dominance des bits de signe

En complément à deux, le plus le bit significatif (MSB) détermine le signe. Lors de la conversion d'un octet en entier, le MSB est répliqué dans les nouveaux MSB. Par conséquent, un octet de 8 bits 255 (11111111) devient un entier de 32 bits 11111111111111111111111101010101. premier MSB de gauche à droite et en inversant tous les bits suivants. Pour notre représentation int de 255 ci-dessus, cela donne 00000000000000000000000001111111 = -1. Cela explique pourquoi Java affiche -124, la valeur signée de 132.

Révéler la vérité non signée

Pour découvrir la valeur non signée d'un octet, nous utilisons un masque de bits ( 0xff) qui isole les 8 bits de poids faible, en supprimant les bits de signe superflus. L'application de cette opération de masquage à l'octet signéByte = -1 donne la valeur non signée unsignedByte = 255.

Bitwise Magic

Bitwise AND masque les bits de signe inutiles. Lorsqu'un int est converti en octet, Java supprime les 24 premiers bits. Le masquage garantit que les 8 bits survivants sont interprétés par Java comme une valeur positive, puisque le bit de signe est désormais 0.

Démasquer l'intrigue de l'octet

Ce comportement met en évidence la distinction cruciale entre les représentations signées et non signées des nombres et les opérations au niveau des bits en jeu lors des conversions de types de données. En comprenant ces principes, nous pouvons déchiffrer le casse-tête des conversions d'octets en Java et éviter des résultats inattendus.

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