2014-10-09 13 views
16

Więc natknąłem coś, co pomylić mnie kiedy rzucając byte do char, zwykle Chciałbym to zrobić:Składnia Java - znak plusa plus po rzucie jest ważny?

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

Które będzie drukować

A 
B 
C 
D 
E 

przypadkowo zostawiła + między (char) i b i uzyskałem ten sam wynik: !?

tak:

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

Dlaczego właściwie tak się dzieje?

Czy zasadniczo robię (char)(0x00 + b)? Ponieważ

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

daje inny wynik.

Uwaga: Użycie wersji Java 1.8.0_20

+12

Bezpośrednio przesyłając bajty do znaków, ignorujesz [kodowanie znaków] (http://en.wikipedia.org/wiki/Character_encoding). – Jesper

Odpowiedz

26

Dlaczego tak się dzieje?

Jeśli wstawisz jednoargumentowy operator - przed liczbą lub wyrażeniem, neguje to.

Podobnie, jeśli wstawisz jednoargumentowy operator + przed liczbą lub wyrażeniem, nic nie zrobi.

Bezpieczniejsze sposób przekonwertować bajt do char jest

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

To będzie pracować dla znaków od 0 do 255, a nie 0 do 127.

BTW można użyć operatorów Jednoargumentowy napisać niektóre mylące kod jak

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

wow, że ostatni jest okropny :) – Baldrickk

+1

Jeśli celem jest zamiana binarnego zakodowanego ciągu tekstowego na znaki, nie ma właściwie bezpiecznej metody przesyłania bajtów do znaków. Musisz użyć dowolnej z kilku metod w API, które uwzględniają kodowanie znaków (konstruktory String, Reader, CharsetDecoder, itp.). – jarnbjo

+0

@jarnbjo +1 O ile nie można przyjąć kodowania US-ASCII lub ISO-8859-1 (jak w powyższym przykładzie), należy użyć enkodera. Możesz napisać koder UTF-8, jeśli jesteś naprawdę zainteresowany, ale jeden z wbudowanych koderów prawdopodobnie będzie najlepszym wyborem. –

7

b jest bajt, a być wyrażone jako + B jak również. Na przykład 3 można zapisać również jako +3. Zatem ((char) + b) jest takie samo jak ((char) b)

5

+ jest jednoskładnikowa oraz operator - jak można powiedzieć, że 1 jest równoważna +1, b jest odpowiednikiem +b. Przestrzeń między + i b jest nieistotna. Ten operator ma wyższy priorytet niż rzutowanie, więc po jego zastosowaniu (bezczynności, jak zaznaczono), wynikowy byte jest następnie rzutowany na char i daje taki sam wynik jak poprzednio.

Powiązane problemy