C++ で負の値の左シフトを実験2021年06月03日 12時41分01秒

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
一部の言語では左に負の数シフトするのは、右にその正の数シフトするのと同じだという考え方もあるようだ。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2021/06/03/9384134/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。