マイナー(?)な演算子の仕様を調べてみる
演算部分を実装している過程でふと気になったのですが、
「ビットシフトに負の値が来るとどうなるんだろう?」
というわけで、↓のような式で調べてみる。
結果、numを出力してみると「0」になっていた。
int num = 2 << -1;
…何か符号付きだと考えづらいな…、
ついでに、-1も16進にしてしまおう。
これも出力は「0」。
unsigned int num = 2 << 0xffffffff;
……もしかすると、最上位ビットだけを見て、
負だったら0を返すとかなってたりするのかな
結果、出力は「2」
unsigned int num = 2 << 0x80000000;
どうやら負かどうかは関係ないらしい。
ちなみに、ここから少しだけ値をいじってみると?
出力は「num1 = 4」「num2 = 0」
unsigned int num1 = 2 << 0x80000001;
unsigned int num2 = 2 << 0x7fffffff;
……もしかして、下位ビットしか見てないんじゃないか?(汗)
とりあえず、これらの出力は全部「0」
unsigned int num1 = 0xffffffff << 0x00ffffff;
unsigned int num2 = 0xffffffff << 0x0000ffff;
unsigned int num3 = 0xffffffff << 0x000000ff;
--- 修正 (08/01/27 23:33)「0xffffff」→「0」
で、これの出力が「0x80000000」
unsigned int num = 0xffffffff << 0xffffff1f;
試しに他にも試してみる。
出力はそれぞれ「0x80000000」と「0xffffff80」
unsigned int num1 = 0xffffffff << 0xff00ff1f;
unsigned int num2 = 0xffffffff << 0xffffff07;
以上より、
どうやら、ビットシフト演算子は「下位1バイト分」の数値のみで演算しているようです。
ついでにおまけ(?)で「!」に関しても調べてみる。
出力は「1」と「0」
unsigned int num1 = !0;
unsigned int num2 = !1;
他にも試して見ましたが、
「0なら1」「非0なら0」を返すようです。
…「num != 0」とか「~num & BIT」で済むと思うので
存在意義が少し微妙な気がするんですけどね…コレ(酷)