計算機算術

C言語で、int型の −7 / 2 と −7 >> 1(算術右シフトの場合)の結果の組み合わせとして正しいものはどれか。

  1. A−7 / 2 は −3、−7 >> 1 は −4
  2. Bどちらも −4
  3. 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. 組み合わせが逆になっています。
この分野を解く 分野ページへ

計算機算術のほかの問題

  1. C言語で、32ビットの符号なし整数(unsigned int)の 0 から 1 を引いた結果はどれか。
  2. 符号なしの整数どうしの足し算で、結果が表せる範囲を超えた(桁あふれした)ことを判定する方法として正しいものはどれか。
  3. 浮動小数点数で、隣り合う表せる値どうしの間隔についての説明として正しいものはどれか。
  4. IEEE 754の単精度の浮動小数点数で、0から始めてすべての整数を正確に表せる上限はどれか。
  5. 金額の計算で、2進数の浮動小数点数ではなく、最小の単位(1円や1セント)を1とする整数で扱うことが多い主な理由はどれか。