Réponses
Trop de publicités?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.
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):
10000100
- 1 =10000011
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.
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.
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