計算機算術
C言語で、int型の −7 / 2 と −7 >> 1(算術右シフトの場合)の結果の組み合わせとして正しいものはどれか。
- A−7 / 2 は −3、−7 >> 1 は −4
- Bどちらも −4
- C−7 / 2 は −4、−7 >> 1 は −3
答えと解説を見る
正解:A. −7 / 2 は −3、−7 >> 1 は −4
C言語(C99以降)の整数の割り算は、結果を0の方向に切り捨てると定められているので、−3.5 は −3 になります。一方、算術右シフトは小さい方(負の無限大の方向)に切り捨てる働きになり、−7(1111 1001)を右に1ビットずらすと 1111 1100 = −4 になります。そのため、負の数ではシフトと割り算は一致しません。コンパイラが2での割り算をシフトに置き換えるときは、負の数のための補正の命令を加えています。正の数なら両者は一致します。
- A. 正しい。割り算は0方向、シフトは小さい方向に切り捨てます。
- B. 割り算は0の方向に切り捨てるので −3 です。
- C. 組み合わせが逆になっています。