補数の基本

概要

最終更新日:2020/02/03

この記事では補数の基本やなぜ補数を使用するのかなどの説明をします。
コンピュータ基礎ではありますが、ITパスポートや基本情報試験の
問題として出題されていますので、資格を取得する方も理解してください。


補数とは

補数とはある数を特定の数にするために加算する数のことで、
以下の通り、二種類あります。
  • n - 1の補数
  • nの補数
使用されているnはn進数の「n」を使用します。
例えば10進数の場合「9の補数(10 - 1の補数)」と「10の補数」です。

n - 1の補数

n - 1の補数ある数に足すことで、その桁の最大値になる数です。
例えば最大桁数3桁の10進数(900)10の場合、3桁の最大の数は999です。
900を999にするためには、どのような数が必要かというと、
「999 - 900」で「99」が必要です。
この900を999にするために必要な「99」という数が「n - 1の補数(9の補数)」です。

nの補数

nの補数ある数に足すことで、その桁が一つ繰り上がる数です。
今回も最大桁数3桁の10進数(900)10でやってみます。
桁が繰り上がる4桁の最小値は1000なので、900を1000にするためには
「1000 - 900」で「100」が必要です。
この900を1000にするために必要な「100」が「nの補数(10の補数)」です。

補数の使用方法

補数の性質が完了したので、次はこの補数の使用箇所の説明をします。
補数は以下の場合に使用しています。
  • 足し算で引き算する
  • 負の数を表す

足し算で引き算をする

補数を使用すると足し算で引き算を行うことができます。
なぜ、わざわざ足し算を使って引き算をする必要があるのかと考えると思いますが、
実はコンピュータは引き算ができません。
ですが、引き算を計算で使用しないことなどありえないので、
どうにかして引き算をできるようにする必要がありました。
そこで考えられたのが、今回の補数を使用した方法です。

計算方法

計算は以下の手順で行います。
  1. 最大桁数を決める
  2. 引く側(右辺)の補数を求める
  3. 補数を引かれる側(左辺)に足す
  4. 最大桁数を超えた分を省く

①.最大桁数を決める

補数を求めるために計算で使用する数の最大桁数を決めます。
今回は最大桁数は3桁として以下の計算を行います。
    900 - 300 = 600

②.引く側(右辺)の補数を求める

桁数が決まったら、次は引く側の数の補数を求めます。
今回は引く側の数は300なので、補数は「700」です。
    300 + 700 = 1000

③.補数を引かれる側(左辺)に足す

補数が求まったら、この補数を引かれる側の数に加算します。
    900 + 700 = 1600

④.最大桁数を超えた分を省く

最後に最大桁数を超えた分の数を省きます。
今回は1600という答えが出ており、最大桁数は3桁なので、
4桁目の「1000」という数字が省くと、引き算と同じ答えになります。
    1600 => 600
桁上がりした分を省くという方法を強引に感じる方もいると思いますが、
コンピュータ側ではこの性質を上手く利用していますので、
次はそれについての説明をします。

覚えておける桁数に制限がある

コンピュータはメモリという機能を使用して2進数の数を保存しており、
その時に覚えておける2進数の桁数を以下の中から決めています。
    8桁
    16桁
    32桁
    64桁
では、8桁までしか覚えておけない場合、、以下のように8桁を超えてしまったら
9桁目以降の数はどうなると思いますか?

computer_basics_0007

答えは「許容できる桁を超えてしまった分は無視する」です。

computer_basics_0008

上の式では答えが9桁目までありますが、9桁目は覚えることができません。
今回の答えのように覚えようとした数が許容できる桁数(範囲)を超えることを
「桁あふれ」や「オーバーフロー」と呼んでいます。
コンピュータは桁あふれをわざと起こして、補数による引き算を効率的に実行しています。

負の値を表現する

補数を使用することで、負の数を表現できます。
この方法は主に2進数で使われています。

2進数の構成

コンピュータが2進数で数を保存する場合、負の数を扱えるかどうかで構成が違います。
まずは負の数を扱わない場合です。

computer_basics_0009

次は負の数を扱う場合です。

computer_basics_0010

二つの構成の違いは使用できる桁の最上位の部分が仮数部か符号部かですが
まずは仮数部と符号部の説明をします。
仮数部は有効数字を表しています。
符号部はこの数が正の数か負の数かを表しており、
0と1のどちらが正と負になるかは以下の通りです。
    0 => 正
    1 => 負
負の数を扱えるかどうかで以下のような違いが出ます。
    保存できる数の範囲が変わる
負の数を扱う場合と扱わない場合で保存できる数の範囲が変わります。
例えば8桁の2進数で負の数を扱わない場合は「0~255」まで扱えますが、
負の数を扱う場合「-128~127」が扱える範囲になります。

負の数の求め方

負の数を求める手順は以下の通りです。
  1. 数を反転させる(1の補数)
  2. 反転した値に1を足す(2の補数)
上の手順を(0010 0100)2で行います。
まずは、(0010 0100)2を反転させます。
    (0010 0100)2 => (1101 1011)2
次に反転した数に1を足します。

computer_basics_0011
この結果で出た(1101 1100)2が(0010 0100)2の負の数です。

負の数の証明

「負の数の求め方」の(1101 1100)2が(0010 0100)2の負の数であることを証明してみます。
証明方法は単純で二つの数を足した答えが0ならば負の数とします。
なぜなら、二つの数が符号が異なるだけならば、絶対値は同じ数のはずです。
ならば、二つの数を足した答えは0になるはずなので、
この結果なら負の値である証明とします。

まずは分かりやすい10進数の(36)10と(-36)10で証明を行ってみます。
    36 + (-36) = 0
2進数でも上の結果のように答えが0になれば証明成功です。
では、2進数で証明を行います。

computer_basics_0012
結果は(1 0000 0000)2となりました。
ここで最上位の1は桁あふれのために無視されるので、
実質的には(0000 0000)2です。
二つの数の足し算の答えが0になったので、
(1101 1100)2が(0010 0100)2ということが証明されました。

まとめ

今回の記事の要点を最後にまとめました。
  • 補数はある数を特定の数にするために加算する数
  • 補数はn - 1の補数とnの補数がある
  • 補数を使ったら引き算で足し算ができる
  • 補数で負の値を表現できる