C/C++ で負の値のシフト演算の結果は未定義だったが、実際にどんな値を返してくるか興味を持ったので実験。
% cat leftshit.cpp
#include <iostream>
int main()
{
int shift = 2 << 1;
std::cout << "2 << 1 = " << shift << std::endl;
shift = 2 << -1;
std::cout << "2 << -1 = " << shift << std::endl;
shift = -2 << 1;
std::cout << "-2 << 1 = " << shift << std::endl;
shift = -2 << -1;
std::cout << "-2 << -1 = " << shift << std::endl;
}
コンパイルするとしっかりと警告がでる。
% clang++ leftshit.cpp
leftshit.cpp:8:15: warning: shift count is negative [-Wshift-count-negative]
shift = 2 << -1;
^ ~~
leftshit.cpp:11:16: warning: shifting a negative signed value is undefined [-Wsh
ift-negative-value]
shift = -2 << 1;
~~ ^
leftshit.cpp:14:16: warning: shift count is negative [-Wshift-count-negative]
shift = -2 << -1;
^ ~~
3 warnings generated.
実行してみたら、こんな結果になった。
% ./a.out
2 << 1 = 4
2 << -1 = 4215872
-2 << 1 = -4
-2 << -1 = 4215872
一部の言語では左に負の数シフトするのは、右にその正の数シフトするのと同じだという考え方もあるようだ。
最近のコメント