2012-11-15 22 views
20

benBayt değerlerini karşılaştırın? ... does</p> <pre><code>boolean match = (data[0] == 0xFE); </code></pre> <p>... ederken

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

... true döner ... Bir değere sahip bir byte dizi karşılaştırdığımızda, neden merak ediyorum değil? data Ben işaret uzantılı bir int 0xFF teşvik ile ilgisi var olduğuna inanıyoruz

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

herhangi derleyici uyarılarını alıyorsunuz olabilir? Bunların tamsayı değişmezleri olabileceğini düşünüyorum (ve sonra karşılaştırma dizideki negatif sayınız ve pozitif tamsayı değişkeni ile int olarak yapılabilir). – Thilo

cevap

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

tamsayılar karşılaştırır, bu ifadenin int için baytdata[0] büyütmek ve ikinci bir int 0xFE(254) için parantez içinde ne karşılaştırır. data[0]'un (byte)0xFE olduğunu belirttiğinizde, önce 0xFE tamsayısına ölçeklenecek ve 0xFE tamsayısıyla karşılaştırılacak, bu da işe yarar. 254

data[0] = (byte) 0xFE; 

bir bayt (bu kapalı signed s) ve değeri -2 olup:

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

int 0xFE bir bayt karşılaştırır.

-2254 eşit değil, bu yüzden bir bayt olarak [0] verileri karşılaştırmak gerekir bu yüzden ya ölçeği gibi oluşturulup o tamsayı 0xFE karşılaştırarak önce tam sayıya.

Daha basit karşılaştırma

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

Çok teşekkürler! –

3

ile byte dizidir. İlk ifadede, 0xFE ayrıca bir int'ye yükseltilir ve bu nedenle data[0] & 0xFF sonucunun bir int ve bir int karşılaştırması yapılır.

Ancak, ikinci kod örneğinde, yapılan işlem yoktur ve bu nedenle int için hiçbir promosyon yoktur. Yani, bu veri [0] int'ye yükseltilmez, ancak 0xFE bir int'dir. 0XFF bir tam sayıdır olarak

İlgili konular