Sto per iniziare a lavorare su qualcosa che richiede la lettura di byte e la creazione di stringhe. I byte letti sono le stringhe UTF-16. Quindi, per testare le cose, volevo convertire un semplice array di byte nella codifica UTF-16 in una stringa. I primi 2 byte dell'array devono rappresentare l'endianness e quindi devono essere 0xff 0xfe o 0xfe 0xff. Così ho cercato di creare il mio array di byte come segue:Conversione implicita Java di int a byte
byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00};
Ma ho ottenuto un errore perché 0xFF 0xFE e sono troppo grandi per inserirsi in un byte (perché i byte vengono firmati in Java). Più precisamente l'errore era che l'int non poteva essere convertito in un byte. So che potrei semplicemente convertire esplicitamente da int a byte con un cast e ottenere il risultato desiderato, ma non è quello di cui si tratta.
Solo per provare qualcosa ho creato una stringa e chiamato getBytes ("UTF-16"), quindi stampato ciascuno dei byte nella matrice. L'output era leggermente confuso perché i primi due byte erano 0xFFFFFFFE 0xFFFFFFFF, seguito da 0x00 0x52 0x00 0x6F. (Obvisouly il endianness qui è diverso da quello che stavo cercando di creare sopra ma che non è importante).
Utilizzando questa uscita ho deciso di provare a creare il mio array di byte allo stesso modo:
byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00};
e stranamente ha funzionato bene. Quindi la mia domanda è: perché Java consente a un valore intero di 0xFFFFFF80 o superiore di essere automaticamente convertito in un byte senza un cast esplicito, ma qualcosa di uguale o maggiore di 0x80 richiede un cast esplicito?
Grazie, questo lo rende molto più chiaro. – DaveJohnston