2009/06/13

[memo] bit shift operator

C言語のビットシフト演算子は、左オペレータの幅以上の値を右オペレータに指定した場合、その動作は未定義である。これは規格で定義された動作である。以下、JIS X 3010 2003 (ISO/IEC 9899) P48 より引用する。

6.5.7 ビット単位のシフト演算子
シフト式:
加減式
シフト式 << 加減式
シフト式 >> 加減式
制約 各オペランドは,整数型をもたなければならない。
意味規則 整数拡張を各オペランドに適用する。結果の型は,左オペランドを拡張した後の
型とする。右オペランドの値が負であるか,又は拡張した左オペランドの幅以上の場合,
その動作は,未定義とする。

----

このことから、ビットパターンを出力する以下のコードは c の値によって動作するか否かが決まる。型によってオペレーターの幅は異なるため、頭の隅にいれておく必要があろう。間違っても俺のように何も考えずに100ビットとかシフトさせようとしないでください(´ー`; )

#include <stdio.h>

int main(int argc, char *argv[])
{
unsigned long long a = 65535; // long long は一般に64bitの幅を持つ
int c;
for (c = 63; c >= 0;c--) { // c を 64にすると途端に動作しなくなる
printf("%d", (int)((a >> c) & 1));
}
printf("\n");
return 0;
}

0 件のコメント: