2014-10-09 7 views
16

Così mi sono imbattuto in qualcosa che mi ha confuso quando lancia un byte a char, di solito farei questo:Sintassi Java: il segno extra plus dopo il cast è valido?

for (byte b:"ABCDE".getBytes()) { 
    System.out.println((char)b); 
} 

che stamperà fuori

A 
B 
C 
D 
E 

ho accidentalmente lasciato un + tra il (char) e b e ottenuto il risultato stesso !?

Come così:

for (byte b:"ABCDE".getBytes()) { 
    System.out.println((char) + b); 
} 

Perché esattamente sta succedendo questo?

Sto essenzialmente facendo (char)(0x00 + b)? Perché

System.out.println((char) - b); 

produce un risultato diverso.

Nota: L'uso di Java 1.8.0_20 versione

+12

Mediante il casting diretto di byte in caratteri, si ignora la [codifica caratteri] (http://en.wikipedia.org/wiki/Character_encoding). – Jesper

risposta

26

Perché esattamente sta succedendo?

Se si mette un operatore unario - prima di un numero o di un'espressione esso lo esclude.

Analogamente, se si mette un operatore unario + prima di un numero o un'espressione, non fa nulla.

Un modo più sicuro per convertire un byte ad un char è

char ch = (char)(b & 0xFF); 

Questo funziona per i caratteri compresi tra 0 e 255, piuttosto che da 0 a 127.

BTW è possibile utilizzare gli operatori unari di scrivere un codice di confusione come

int i = (int) + (long) - (char) + (byte) 1; // i = -1; 
+8

wow che l'ultimo è orribile :) – Baldrickk

+1

Se l'intenzione è convertire una stringa di testo codificata in binario in caratteri, in realtà non esiste un modo sicuro per trasmettere i byte ai caratteri. È necessario utilizzare uno dei vari metodi dell'API, che considerano la codifica dei caratteri (costruttori di stringhe, Reader, CharsetDecoder e così via). – jarnbjo

+0

@jarnbjo +1 A meno che non si possa assumere la codifica US-ASCII o ISO-8859-1 (come nell'esempio precedente), è necessario utilizzare un codificatore. È possibile scrivere un encoder UTF-8 autonomamente se si è veramente appassionati, ma uno degli encoder incorporati potrebbe essere la scelta migliore. –

7

b è un byte, e che essere espresso come + b pure. Ad esempio, 3 può essere scritto anche come +3. Quindi, ((char) + b) è uguale a ((char) b)

5

il + è l'unario operatore più - come si può dire che 1 è equivalente a +1, b equivale a +b. Lo spazio tra + e b non è pertinente. Questo operatore ha una precedenza più alta rispetto al cast, quindi dopo averlo applicato (senza fare nulla, come indicato), il risultato byte viene quindi assegnato a un char e produce lo stesso risultato di prima.

Problemi correlati