C言語 ビット演算?

原油高のせいか、油が足りません。
スーパーでもらったレジ袋を開けられないこと約1分。指をなめると開けられるんでしょうが、負けた気がするのでなんとか爪で突破口を開きました。

C言語だとよくビット演算やらビットシフトやらをやると思います。


unsigned long a = 0x80;
unsigned long b;

b = a>>1;

しかしこの右シフト、符号付整数と符号なし整数では動作が違う。ということを昨日知った。
符号付の場合は算術シフト、符号なしの場合は論理シフト。
算術シフトでは符号をあらわすビット、つまり先頭のビットは移動しない。
だから例えば


long a = -2;
long b;

b = a>>1;

とするとbは-1になるという。


long a = -2;
long b;

b = ((unsigned int)a)>>1;

だとbは2147483647になるという。

というわけなんですが、実は符号付整数の右シフトが算術シフトになるか論理シフトになるかは処理系依存らしいです。一般的には算術ですが。
あと右シフトだけでなく符号付整数のビット演算は全部処理系依存って話も。未確認ですが。

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: C言語, 聞いて欲しい独り言 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。