以前、
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 へ代入される値がコンパイル時に計算されるのか実行時に計算されるのか、私は知らない。