C言語の左シフト演算は符号付きの場合も論理シフトする

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

本当は言語としては未定義なのですが、主要なコンパイラは論理シフト演算として実装しているようです。gccとclangでは論理シフトしました。

#include <stdio.h>

int main()
{
    // 1byteのsigned charで検証
    signed char signed_1;
    signed char signed_2;

    //0b接頭辞で2進数を表現できる
    signed_1 = 0b01010000; // -> 80
    signed_1 = signed_1 << 1; // -96(0b10100000)
    printf("sigined_1: %d\n", signed_1);

    signed_2 = 0b10111111; // -> -65
    signed_2 = signed_2 << 1; // 126(0b01111110)
    printf("signed_2: %d\n", signed_2);
}

算術シフトのつもりでビットシフトするとハマりますね。

ちなみに、右シフトはちゃんと算術シフトされます。

あなたのお役に立てれば嬉しいです。

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す

*