JavaでByte型変数をInt型にキャストする際には、気を付けなければならないことがあります。
前回のエントリーで、Byte型配列を16進数文字列に変換するメソッドを作りましたが、その時にByte型をInt型へ変換するには、ただ単にキャスト変換するのではなく、「0xFF」でANDビット演算しなければ値がおかしくなるという事を書きました。
どういう事かというと…
byte a = (byte)0xC8 //10進数では200のはず int b = (int)a; Sytem.out.println(b);
この実行結果は、「200」ではなく、「-56」が表示されます。
それを、
byte a = (byte)0xC8 //10進数では200のはず int b = a & 0xff; Sytem.out.println(b);
とすると、実行結果は「200」になってくれます。
しかし、なぜそのままInt型にキャスト変換するだけじゃダメなのか? なぜ0xFFでAND演算をしたら、期待した数値になるのか?そのあたりが僕の中でもやもやしてました。
「なんだかよく分からないけど、Byte型で作った16進数をInt型に変換する時には、0xFFでAND演算するオマジナイをしなきゃならない」
初級プログラマな僕は、そんな感じで全然理解出来てなかったんですよね。 でも、このオマジナイが僕にとってはブラックボックスで気持ち悪い; 自分が理解出来てないものを、プログラムの中で扱うのなんて落ち着かないったらありゃしません。
そこで、なぜByte型をInt型へそのままキャストしてはいけないのか。なぜ0xFFでAND演算をするとうまく変換されるのか。 そのオマジナイの中身を調べてみることにしました。