[0041] 2の補数

平成11年度春期 (旧)第2情報処理技術者試験より
 負数を2の補数で表すとき、8ビットで表現できる整数の範囲は10進数でどれか。
0 ~ 255
-127 ~ 127
-127 ~ 128
-128 ~ 127

正解

解説

 2の補数に関する問題です。

 一般的に、固定小数点数の負の数の表現には、2の補数が用いられ、先頭の1ビットが符号を表します。これを暗記していれば、選択肢がかなり絞れると思います。暗記できていない方は、なぜ、コンピュータでは、2の補数を用いて負の数を表現するか知っておきましょう。以下説明します。


[補数とは?]

 補数とは、ある数が、ある基準となる数となるために加える必要がある数のことです。「ある基準となる数」には2つの考え方があり、
    1) その桁で最大の数になるもの
    2)ちょうど次の桁へ繰り上がりになるもの

があります。10進数であれば、1)のケースを9の補数、2)を10の補数といいます。例えば、10進数 46の9の補数、10の補数は以下のように求めることができます。
    2桁の10進数、46の9の補数は、99 - 46 = 53
    2桁の10進数、46の10の補数は、100 - 46 = 54

となります。

 2進数の場合も、10進数の場合と同様に、1の補数、2の補数があります。(2進数の1は桁内での最大数、2進数の2は桁が繰り上がった数です。10進数における、9、10と同じですね)


[2の補数を負数の表現に使う理由は?]

 それでは、3桁の2進数について、それぞれの2の補数、すなわちある数とある数を足すと1000となる組み合わせを考えてみましょう。下の表をみてください。



 最終行の 1000 については、4桁となっているので、とりあえず除外して考えましょう。また、先頭行の100については、「ある数」と「2の補数」がまったく同じになるので、これもとりあえず、左側の「ある数」を除外して考えましょう。(最後まで読み進んでもらうと理由がわかると思います)

 すると、上の表では、それぞれの数の先頭行が、「ある数」は0、「2の補数」は1となっているのが分かると思います。最終行の「ある数」は、「000」となっており、これを、文字通り10進数の0と決めましょう。また、先頭1ビットの0を「+」、先頭1ビットの1を「-」とすると、下の表のように、正負の表現がされることになります。




 このように2の補数で負数を表現すると、計算の辻褄があいます。

   1 + (-1) = 001(2) + 111(2) = 1000(2)、 先頭の1ビットを消して 000(2)
   2 + (-2) = 010(2) + 110(2) = 1000(2)、 先頭の1ビットを消して 000(2)
   3 + (-3) = 011(2) + 101(2) = 1000(2)、 先頭の1ビットを消して 000(2)


 「ある数と2の補数を足しても000じゃなくて、1000になるじゃないか」とおっしゃる方もいるかもしれませんが、コンピュータでは決められたビット以上の桁は、無視されてしまいます。3ビットという決められた枠の中では、「111」に+1すると「1000」ではなく、先頭の1ビットが枠に収まりきらず、「000」となるのです。

 人間が2の補数を求めるのは計算が面倒ですが、コンピュータからすると、ビットの反転と+1の足し算だけで可能なので、容易な作業といえます。これで、コンピュータ上で、3 - 1 の計算を行う場合も、

   3 + (-1) = 011(2) + 111(2) = 1010(2)、 先頭の1ビットを消して 010(2) = 2(10)

となり、加算のみで減算を行うことができます。つまり、コンピュータが「減算を行う」という仕組みを加算で代用できるわけで、計算回路の簡略化につながります。
 以上が、コンピュータ上で2の補数を用いてマイナスの数を表現する理由です。

  -----------------------

 前置きが長くなってしまいましたが、問題の解答に移りましょう。

8ビットですから、先頭1ビットを符号を表すものとすると、表現可能な正の数は、0を含めると
   00000000 ~ 01111111、つまり、01111111(2) = 127 まで表現可能。

一方、負の数は
   11111111 ~ 10000000、つまり、10000000(2) = -128 まで表現可能。

となります。

 したがって、-128 ~ 127のエが正解となります。
※ 解説の内容は執筆時点のものであり,含まれている情報の正確性,妥当性について保証するものではありません。ご注意ください・・・

関連する(かもしれない)問題