鍋あり谷あり

テーマを決めずに適当に書いています。

私の知らないjava - シフト演算

以前、
id:Nabetani:20040407:p1
で、int を 32bit シフトすると元に戻ることと戻らないことがあるという話を書いた。
java ではどうなるんだろうということで試してみた。

public class Test1 {
  static final int ctI = 0x12345678<<32;
  static final long ctL = 0x1122334455667788L<<64;
  public static void main(String[] args) {
    int rtI = 0x12345678<<(args.length==100 ? 0 : 32);
    long rtL = 0x1122334455667788L<<(args.length==100 ? 0 : 64);
    System.out.println( "ct(32) : " + Integer.toString(ctI,16) );
    System.out.println( "rt(32) : " + Integer.toString(rtI,16) );
    System.out.println( "ct(64) : " + Long.toString(ctL,16) );
    System.out.println( "rt(64) : " + Long.toString(rtL,16) );
  }
}

結果は

ct(32) : 12345678
rt(32) : 12345678
ct(64) : 1122334455667788
rt(64) : 1122334455667788

こんな感じ。
まあ ct と rt で値が同じだし、32bit と 64bit でも似たような動作になるので困らないと思うが、シフト演算のはずなのにゼロにならないのは意外。
きっと java のことなので、厳密に定義されているに違いないと思っているんだが、どうなんだろ。

念のために書いておくと。
ct へ代入される値がコンパイル時に計算されるのか実行時に計算されるのか、私は知らない。