エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

それはおかしいと思います。

public class Shift {
    public static void main(String[] args) {
        for(int i = 0; i < Integer.SIZE + 2; ++i) {
            System.out.printf("%08x%n", 1 << i);
        }
    }
}

実行。

$ javac Shift.java 
$ java Shift
00000001
00000002
(中略)
40000000
80000000
00000001
00000002

えーっ!

型のビットサイズを超えてシフトしたら、ビットを押し出してくれることを期待したのに、まったくの予想外の挙動。

この挙動はシフトではありません。ローテイトです。

…。

そうか、<< 演算子はローテイト演算子なんだ…。

…で済めばよかったんですが(いや、それで済んでもあんまりよくないですけど)。

public class Shift {
    public static void main(String[] args) {
        for(int i = 0; i < Integer.SIZE + 2; ++i) {
            System.out.printf("%08x%n", 3 << i);
        }
    }
}

実行。

$ javac Shift.java 
$ java Shift
00000003
00000006
(中略)
c0000000
80000000
00000003
00000006


…。

いや、それ、絶対おかしい。