マイナー(?)な演算子の仕様を調べてみる

 演算部分を実装している過程でふと気になったのですが、

「ビットシフトに負の値が来るとどうなるんだろう?」





 というわけで、↓のような式で調べてみる。


    int num = 2 << -1;
結果、numを出力してみると「0」になっていた。



 …何か符号付きだと考えづらいな…、

ついでに、-1も16進にしてしまおう。


    unsigned int num = 2 << 0xffffffff;
これも出力は「0」。



 ……もしかすると、最上位ビットだけを見て、

負だったら0を返すとかなってたりするのかな


    unsigned int num = 2 << 0x80000000;
結果、出力は「2

どうやら負かどうかは関係ないらしい。



 ちなみに、ここから少しだけ値をいじってみると?


    unsigned int num1 = 2 << 0x80000001;
    unsigned int num2 = 2 << 0x7fffffff;
出力は「num1 = 4」「num2 = 0」



 ……もしかして、下位ビットしか見てないんじゃないか?(汗)


    unsigned int num1 = 0xffffffff << 0x00ffffff;
    unsigned int num2 = 0xffffffff << 0x0000ffff;
    unsigned int num3 = 0xffffffff << 0x000000ff;
 とりあえず、これらの出力は全部「0」

 --- 修正 (08/01/27 23:33)「0xffffff」→「0」


    unsigned int num = 0xffffffff << 0xffffff1f;
 で、これの出力が「0x80000000

試しに他にも試してみる。


    unsigned int num1 = 0xffffffff << 0xff00ff1f;
    unsigned int num2 = 0xffffffff << 0xffffff07;
出力はそれぞれ「0x80000000」と「0xffffff80」



 以上より、

どうやら、ビットシフト演算子は「下位1バイト分」の数値のみで演算しているようです。





 ついでにおまけ(?)で「!」に関しても調べてみる。


    unsigned int num1 = !0;
    unsigned int num2 = !1;
出力は「1」と「0」

 他にも試して見ましたが、

「0なら1」「非0なら0」を返すようです。



 …「num != 0」とか「~num & BIT」で済むと思うので

存在意義が少し微妙な気がするんですけどね…コレ(酷)