はじめに

ダウンシフト演算子「>>」は、ダウンシフトする対象の変数のデータ型により振る舞いが変わります。

このページでは、このダウンシフト演算子「>>」の振る舞いについて説明します。

サンプルコード

以下のようなサンプルコードを用意し、コンパイル→リンクして実行してみます。

サンプルコード
#include <stdio.h>

void main()
{
    signed int i,j;
    unsigned int k,l;

    i=0xffffff00;
    j=0x00ffff00;
    k=0xffffff00;
    l=0x00ffff00;

    printf("signed int i=0x%000000008x\n",i);
    printf("i>>2=0x%000000008x\n",i>>2);

    printf("signed int j=0x%000000008x\n",j);
    printf("j>>2=0x%000000008x\n",j>>2);

    printf("unsigned int k=0x%000000008x\n",k);
    printf("k>>2=0x%000000008x\n",k>>2);

    printf("unsigned int l=0x%000000008x\n",l);
    printf("l>>2=0x%000000008x\n",l>>2);
}

実行結果

上記のコードの実行結果は以下の通りです。

実行結果
signed int i=0xffffff00
i>>2=0xffffffc0
signed int j=0x00ffff00
j>>2=0x003fffc0
unsigned int k=0xffffff00
k>>2=0x3fffffc0
unsigned int l=0x00ffff00
l>>2=0x003fffc0

上記の実行結果で判るとおり、ダウンシフト演算子「>>」は、そのオペランドの型によって振る舞いが変ります。

signedデータに対しては、最上位ビットが1の場合、ダウンシフト後の上位桁は1で埋められ、0の時には0で埋められます。
unsignedデータに対しては、最上位ビットの如何に関わらず、上位桁は0で埋められます。

結論

このように、ダウンシフト演算子「>>」を利用する際は、オペランドの型によってプログラマが意図しない動作を引き起こすことがあります。
数値を扱う際にはオペランドの型をsignedに、ビット列やフラグを扱う際にはオペランドをunsignedにすると、意図しない動作を回避できるのではないかと思います。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まだ評価がありません

表示できるメッセージはありません。