トップ 一覧 Farm 検索 ヘルプ RSS ログイン

暗黙の型キャストの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
{{category JAVA}}
{{category Java}}
{{category プログラミング}}

ためしに下のようなコードを実行したら、何が出力されるでしょう。

 public class CastTest{
   public static void main(String args[]){
     byte a = (byte)0xff;
     if(a == 0xff){
       System.out.println("fefe");
     }else{
       System.out.println("gaso");
     }
   }
 }


知っている人にはあたりまえなのでしょうけど、実際"gaso"と表示されます
変数aが0xffと比較される場合にint型にキャストされて、0xffffffffになるため、
0xffffffff != 0x000000ff となるんですね。
こうやってみてみると、分かりやすいですが、
ソースコード中に埋めこんでしまったら...
しかも、たまにしか実行されないような部分だったら...
ゾッとしますね。
Javaの型キャストはつねに(たぶん)上位側に行われ、
定数は特に指示しない場合、JVMの仕様によりint型になるみたい。
したがって、正しくは、if(a == (byte)0xff)とするみたい。
ちなみに、long型の定数が欲しい場合には、最後に'L'をつけないと
いつまでたってもコンパイルがとおりません。