Char en octet? (Java)
Comment se fait-ce qui se passe:
char a = '\uffff'; //Highest value that char can take - 65535
byte b = (byte)a; //Casting a 16-bit value into 8-bit data type...! Isn't data lost here?
char c = (char)b; //Let's get the value back
int d = (int)c;
System.out.println(d); //65535... how?
En gros, j'ai vu qu'un char
est de 16 bits. Donc, si vous avez jeté dans un byte
comment se fait-aucune donnée n'est perdue? (La valeur est la même après la coulée dans un int)
Merci d'avance de répondre à ce petit ignorant question de la mienne. 😛
EDIT: Woah, découvert que ma sortie d'origine fait comme prévu, mais je viens de mettre à jour le code ci-dessus. En gros, un personnage est jeté dans un octet et puis jeté en arrière dans un char, et de son origine, de 2 octets valeur est conservée. Comment est-ce possible?
source d'informationauteur wakachamo
Vous devez vous connecter pour publier un commentaire.
Comme trojanfoe unis, votre confusion sur les résultats de votre code est en partie due à signer-extension. Je vais essayer d'ajouter une explication plus détaillée qui peut aider avec votre confusion.
Comme vous l'avez remarqué, cela a pour conséquence la perte de l'information. Ceci est considéré comme un rétrécissement de conversion. La conversion d'un char à un octet "il suffit de rejets de tous, mais les n plus faible de bits d'ordre".
Le résultat est:
0xFFFF -> 0xFF
De la conversion d'un octet à un char est considéré comme un spécial de conversion. Il se comporte en fait DEUX conversions. Tout d'abord, l'octet est SIGNE étendu (le nouvel ordre élevé de bits sont copiés à partir de l'ancien bit de signe) int (normal élargir la conversion). Deuxièmement, l'int est converti en char avec un rétrécissement de conversion.
Le résultat est:
0xFF -> 0xFFFFFFFF -> 0xFFFF
Convertir un char en int est considéré comme un l'élargissement de la conversion. Quand un type char est élargi à un type intégral, c'est ZÉRO étendu (le nouvel ordre élevé de bits sont mis à 0).
Le résultat est:
0xFFFF -> 0x0000FFFF
. Lors de l'impression, ce qui vous donnera 65535.Les trois liens que j'ai fournis sont officiel de Java Language Specification de détails sur les conversions de type primitif. Je vous recommande VIVEMENT de jeter un coup d'oeil. Ils ne sont pas très détaillé (et dans ce cas relativement simple). Il détaille exactement ce que java ne les coulisses avec les conversions de type. C'est un espace commun de l'incompréhension pour de nombreux développeurs. Poster un commentaire si vous êtes encore confus à n'importe quelle étape.
C'est l'extension du signe. Essayez
\u1234
au lieu de\uffff
et voir ce qui se passe.java
byte
est signé. c'est contre-intuitif. dans presque toutes les situations où un octet est utilisé, les programmeurs veulent un octet non signé à la place. c'est très probablement un bug si un octet est jeté à l'int directement.Cela ne la conversion prévue correctement dans presque tous les programmes:
De façon empirique, le choix de l'octet signé est une erreur.
Certains plutôt étranges choses en cours d'exécution sur votre machine. Jetez un oeil à Java langage de spécification, chapitre 4.2.1:
... snip autres...
Si votre JVM est conforme aux normes, alors votre sortie doit être
-1
.