ダウンシフト演算子「>>」は、ダウンシフトする対象の変数のデータ型により振る舞いが変わります。
このページでは、このダウンシフト演算子「>>」の振る舞いについて説明します。
以下のようなサンプルコードを用意し、コンパイル→リンクして実行してみます。
#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にすると、意図しない動作を回避できるのではないかと思います。
・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。
まだ評価がありません |
表示できるメッセージはありません。