2012-11-15 11 views
20

Jestem ciekaw, dlaczego, kiedy porównaj byte tablicę z wartością ...Porównać wartości bajtów?

boolean match = ((data[0] & 0xFF) == 0xFE); 

... zwraca true, natomiast ...

boolean match = (data[0] == 0xFE); 

... robi nie? data jest byte tablica z

data[0] = (byte) 0xFE; 
+0

Czy otrzymujesz ostrzeżenia kompilatora? Myślę, że mogą to być liczby całkowite (a następnie porównanie może być wykonane jako int, z liczbą ujemną w tablicy i dodatnią liczbą całkowitą). – Thilo

Odpowiedz

22
boolean match = ((data[0] & 0xFF) == 0xFE); 

porównuje liczby całkowite jako 0xFF jest liczbą całkowitą, to wyrażenie będzie skalować swój bajtdata[0] do int i porównać to, co znajduje się wewnątrz nawiasu do drugiego int 0xFE(254). Jak mówisz, data[0] jest (byte)0xFE, najpierw zostanie skalowany do liczby całkowitej 0xFE i porównany do liczby całkowitej 0xFE, więc to działa.

boolean match = (data[0] == 0xFE); 

porównuje bajt do int 0xFE: 254

data[0] = (byte) 0xFE; 

jest bajt (więc signed), a jego wartość jest -2.

-2 nie jest równa 254, więc dlatego trzeba porównać dane [0] jako bajt lub skali się to na liczbę całkowitą przed porównując ją z całkowitą 0xFE.

Prostsza porównanie może być

boolean match = (data[0] == (byte)0xFE); 
+0

Wielkie dzięki bardzo! –

3

wierzę, że ma do czynienia z promowaniem 0xFF na int z rozszerzeniem migowego. W pierwszym wyrażeniu, 0xFE jest również promowane do int, a zatem wynik data[0] & 0xFF jest również wynikiem porównania int i int.

Ale w drugim przykładzie kodu nie ma żadnej operacji, więc nie ma promocji do int. To znaczy, że dane [0] nie są promowane do int, ale 0xFE to int.

Powiązane problemy