132 votes

Comment Java convertit-il int dans octet ?

<pre><code></code><p>La sortie est -124</p><p>Pourquoi ? Je sais que c’est une question très basique, mais je ne suis toujours pas en mesure de mapper, ou de comprendre comment cela se passe ?</p></pre>

176voto

Wayne Points 1668

En java, un int est de 32 bits. Un octet est 8.

Tout en Java est signé, et les octets, ints, longs sont codés en complément à deux.

Dans ce numéro de schéma le bit le plus significatif indique le signe du nombre. Si plus de bits sont nécessaires, le bit le plus significatif est tout simplement copiés dans le nouveau msb.

Donc si vous avez des octets 255: 11111111 et vous voulez représenter comme un int (32 bits) il vous suffit de copier le 1 de la gauche de 24 fois.

Maintenant, une façon de lire un négatif en complément à deux le nombre est de commencer avec le bit le moins significatif, déplacer vers la gauche jusqu'à trouver le premier 1, puis inverser tous les bits de la suite. Le nombre résultant est la version positive du nombre

donc: 11111111 va - 00000001 -> -1. C'est ce que Java va afficher la valeur.

Ce que vous voulez probablement faire est de savoir non signé valeur de l'octet.

Vous pouvez accomplir cela avec un masque de bits qui supprime tout, mais le moins significatif de 8 octets. (0xff)

Donc:

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

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

Affichera: "Signé: -1 non signé: 255"

Ce qui se passe réellement ici?

Nous utilisons au niveau du bit ET masque tous les étrangers signe bits (le 1 est à gauche de la moins significative de 8 bits.)

1111111111111111111111111010101
&
0000000000000000000000001111111
=
0000000000000000000000001010101

Depuis la 32e est le bit de signe à la place de la 8 bits (Et nous avons mis le bit de signe à 0, ce qui est positif), l'original de la 8 bits de l'octet sont lus par java comme une valeur positive.

90voto

Pacerier Points 15960

Pour comprendre comment cela fonctionne, nous avons besoin de savoir que les ordinateurs de travail, en bits.

132 en base 10 (décimal) 10000100 en base 2 (binaire). Depuis Java stocke int en 32 bits, ce que nous avons est

00000000_00000000_00000000_10000100

Lorsqu'un int est converti en byte, Java côtelettes-off le plus à gauche de 24 bits. Qu'est-ce que la gauche est - 10000100.

En complément à deux, le plus à gauche bits est utilisé en tant que signe. Si la plus à gauche bits est - 0, rien d'autres personnes sera fait.

Si la plus à gauche bits est - 1 (comme nous l'avons ici), cela signifie que le nombre est négatif et plus de travail doit être fait. Pour obtenir de l'ampleur, nous avons moins l'un puis appliquer un complément (appliquer un complément de moyens d'inverser les bits):

  1. 10000100 - 1 = 10000011

  2. 10000011 inversé = 01111100

01111100 s'il est interprété comme un nombre décimal, de 124.

Nous avons donc un nombre négatif avec une magnitude de 124, de nous donner -124.

23voto

bdonlan Points 90068

octet dans Java est signé, donc il a une portée -2 ^ 7 à 2 ^ 7-1-c’est à dire, de -128 à 127. Étant donné que 132 est supérieure à 127, on finit par envelopper autour de 132-256 =-124. Autrement dit, essentiellement 256 (2 ^ 8) est ajoutée ou soustraite jusqu'à ce qu’il tombe dans la gamme.

Pour plus d’informations, vous pouvez lire le complément à deux.

16voto

Peter Lawrey Points 229686

132 est en dehors de la plage d’un octet qui est de -128 à 127 (Byte.MIN_VALUE à Byte.MAX_VALUE) place la mèche supérieure de la valeur de 8 bits est traitée comme étant le signé qui indique qu’il est négatif dans ce cas. Si le nombre est 132-256 = - 124.

2voto

pen Points 11

souvent dans les livres, vous trouverez l’explication de la coulée d’int à octet comme exécuté par la division modulo. ce n’est pas strictement correct tel qu’illustré ci-dessous ce qui se passe réellement est les 24 bits les plus significatifs de la valeur binaire du nombre int sont éliminés, laissant la confusion si le bit de gauche restant est la valeur qui désigne le nombre négatif

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X