2012-11-15 15 views
20

私は値でbyte配列を比較したとき、私は、なぜ知って興味...バイト値を比較しますか?

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

... ...

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

...が行う一方で、trueを返します。ない? dataは、私はそれが符号拡張をintには0xFFを促進に関係していると信じている

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

あなたはどのコンパイラの警告を得ているだろうか?私はそれらが整数リテラルかもしれないと思う(そして、比較は、配列と正の整数リテラルのあなたの負の数で、intとして行われるかもしれない)。 – Thilo

答えて

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

は0xFFが整数であるとして、この表現がintに、あなたのバイトdata[0]をスケールアップし、第二のint 0xFE(254)に括弧内に何と比較します整数を比較します。 data[0](byte)0xFEであると言うと、最初は整数0xFEにスケールされ、整数0xFEと比較されるので、これは機能します。

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

はint型0xFEにバイトを比較しています254

data[0] = (byte) 0xFE; 

はバイトである(それはsignedだ)、その値は-2です。

-2254と等しくないため、整数[0xFE]と比較する前に、データ[0]をバイトとして比較するか、整数と比較する必要があります。

単純比較は

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

大変ありがとう! –

3

byte配列です。最初の式では、0xFEもintに昇格されるため、data[0] & 0xFFの結果もintであり、intの比較が行われます。

しかし、2番目のコードサンプルでは、​​操作は実行されていないため、intへの昇格はありません。つまり、data [0]はintに昇格しませんが、0xFEはintになります。

関連する問題