補数の解説(基本情報技術者シラバス用語)

補数の解説(基本情報技術者シラバス用語)
目次

補数とは

補数.png

補数(ほすう)とは、ある基準となる数から、目的の数を引いた「不足分」に相当する数値のことです。コンピュータの世界では、引き算(減算)を足し算(加算)の仕組みだけで処理するために補数が使われます。コンピュータの電子回路は基本的に足し算が得意なため、引き算専用の回路を作るよりも、引く数を「補数」という特別な数に変換してから足し算を行う方が、回路のデザインをシンプルにできるという大きなメリットがあります。補数には大きく分けて「1の補数」(各桁の0と1を反転させたもの)と「2の補数」(1の補数に1を足したもの)があり、コンピュータの負の数を表す際には主に「2の補数」が使われています。

具体例

10進数の「100」を基準としたとき、「65」に対する補数は「100 - 65 = 35」となります。また、4ビットの2進数で「3」(0011)から引き算を行うための「マイナス3」を作る例は以下の通りです。

元の数「3」の2進数表現:0011
各桁を反転(1の補数):1100
さらに1を足す(2の補数):1101 (これがマイナス3に相当)

この「1101(マイナス3)」を「5(0101)」に足すと、「0101 + 1101 = 10010」となり、はみ出た最上位の1を無視すると「0010(2)」となり、正しく「5 - 3 = 2」が計算できます。

もう少し詳しく

なぜ補数を使うと引き算が足し算で済むのでしょうか。これを理解するためには、「自動車の走行距離メーター(オドメーター)」や「桁あふれ(オーバーフロー)」の概念を思い浮かべると分かりやすいです。例えば、3桁までしか表示できないメーター(000〜999)があるとし、現在「005」を指しているとします。ここから「3」を引いて「002」にするには、普通は逆回しにしますが、逆に前へ「997」進めても、メーターは「1002」になろうとしますが最上位の1が表示できずはみ出る(無視される)ため、結果的に「002」を表示します。このときの「997」が、10進数における3に対する「1000の補数」です。これと全く同じ原理を2進数で応用しているのが、コンピュータの引き算です。
コンピュータが負の数を表現する際、一般的には最上位のビット(一番左の桁)を「符号ビット」として扱い、「0なら正、1なら負」と約束します。この表現方法において「2の補数」を採用する最大の理由は、「ゼロ(0)」の表現が1通りに定まるからです。「1の補数」だけで負の数を表現しようとすると、「プラスの0(0000)」と「マイナスの0(1111)」という2つのゼロが存在してしまい、プログラムの条件判定(ゼロかどうかをチェックする処理など)が非常に複雑になってしまいます。2の補数表現であれば、ゼロは「0000」の1つだけになり、ハードウェアの設計もソフトウェアの処理も極めてスマートに統一できるのです。

試験でのポイント

資格試験における補数の問題は、「2の補数表現への変換」と「補数を使った加減算」の2つがメインテーマとなります。ある正の2進数を負の数(2の補数)に変換する際の手順は「①すべてのビットの0と1を反転させる(1の補数にする)、②それに1を足す」という2ステップです。この手順は息をするように自然にできるようになるまで練習しておきましょう。
また、「符号拡張(サインエクステンション)」という概念も出題されることがあります。例えば4ビットの2の補数「1101(マイナス3)」を、8ビットのデータとして扱う場合、単に上位に0を埋めて「00001101」としてしまうと正の数に変わってしまいます。負の数の場合は、上位ビットをすべて符号ビットである「1」で埋めて「11111101」としなければなりません。このルールを知らないと、桁数を拡張する問題で足をすくわれます。さらに、表現できる数値の範囲(nビットの2の補数表現で表せる範囲は、-2の(n-1)乗 から 2の(n-1)乗 - 1 まで)を問う問題も頻出ですので、公式として押さえておきましょう。

関連する用語

補数の計算の基礎となる2進数や、ハードウェアで実際の足し算や反転を行う際に使われる論理演算、また計算結果が指定の桁数に収まりきらなくなるオーバーフローなどの用語と強く関連しています。

読んだ内容を10問練習と実技で確認

記事で理解した用語を、StudyQuestの演習とクラウド実技ラボで定着させます。

10問練習 実技ラボ