Qual è la logica dietro questo codice java

Mi sono imbattuto sotto la linea di Java e ho sconcertato per la sua uscita. Puoi per favore spiegarmi la logica dietro questo codice

System.out.println((int)(char)(byte) -1); 

Produzione:

 65535 

Bene, equivale a:

 byte b = -1; char c = (char) b; // c = '\uFFFF' - overflow from -1 int i = c; // i = 65535 

In realtà la conversione esplicita a int nell’originale è solo per far sì che chiami System.out.println(int) invece di System.out.println(char) .

Credo che la conversione da byte a char stia effettivamente passando per una conversione di ampliamento implicita, quindi è proprio così:

 byte b = -1; int tmp = b; // tmp = -1 char c = (char) tmp; // c = '\uFFFF' 

Questo aiuta affatto?

è lo stesso di

System.out.println((int) '?');

  • (byte) -1 restituisce: -1
  • (char) -1 restituisce (char) -1
  • (int) '?' dà 65535

In java byte è un tipo primitivo a 8 bit firmato (a due complementi). La rappresentazione binaria di un byte con un valore di -1 è 11111111 . Questo quindi viene castato su un char che è una primitiva a 16 bit con un valore compreso tra \u0000 e \uFFFF (0 e 65535) – sembrerebbe che i bit del byte siano spostati a sinistra di 8, con estensione di segno. Quindi a questo punto la rappresentazione binaria è:

 1111111111111111 

… o 65535. Tuttavia, non è così semplice come dire “Oh sì, allora è trasformato in un int che non vediamo la rappresentazione del carattere e viene stampato”. In Java, tutti i primitivi numerici sono firmati! Se assegniamo il char come short che è un’altra primitiva a 16 bit, il programma emetterebbe -1 . Tuttavia, quando lo lanciamo su un int 32 bit. La rappresentazione binaria finale diventa:

 00000000000000001111111111111111 

… che è 65535 sia firmato che non firmato!