7−3を計算する場合には、7に(−3)を加えるということにもなる。
7+(−3)これではまだ7−3とあまり変わらないよう思える。
ここで、−3の部分を正の数で表すことができればだいぶ違うのだが。
これを可能にするために次の様に考える。
10進数の−3の絶対値3にある数を足して繰り上がる(10になる)数は7であるから
7+7=14で、10の桁は無視すると4が残りこれが答えとなる。
この時、「3の補数は7」ということになる。
以上をまとめると 7−3 = 7+(−3)
・引く数の補数を求める 3の補数は7
・補数で足し算する 7+7 = 14
・繰り上がりを無視する 4
補数の考え方を取り入れる理由は、このように「減算を加算で処理できるから」
である。  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
【2の補数】
コンピュータが実際に扱う2進数の場合を考えてみる。
この場合も同じように7−3の計算とし、2進数で8桁とする。
7−3を計算するには、7に(−3)を加えるという方法をとった。
10進数3を2進数8ビットで表すと 00000011であるから、同様に
00000011にある2進数にを足して100000000になる
(9桁目に繰り上げる)数はを求めると
100000000
− 00000011
────────────
11111101
00000011の2の補数11111101が求まるが、これを簡単に求める方法がある。
「0と1のビットパターンを反対にして1を加える」という操作をする。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(上記減算の引く数と答えを見ると、なんとなくそんな感じはするが)
00000011
0と1のビットパターンを反転する ↓↓↓↓↓↓↓↓
11111100
1を加算する + 00000001
────────────
11111101
よって、10進数3の2の補数は11111101となり、7−3の代わりに
7+(−3)= 7+(3の2の補数)という計算を行と
00000111
+ 11111101
────────────
100000100
 ̄
↓
桁あふれは無視する。
よって 00000100(=10進数の4)のなる。
このやり方により演算回路は加算だけあればよいことになる。
つまり、減算のかわりにその数の2の補数を加算しているのである。
同様に、掛け算は加算を繰り返し、除算は減算の繰り返しで実現可能になる。
コンピュータでは、いろいろな計算ができるが、ハードウェア的には加算しかできないのである。
【2の補数を使っての表現】
補数を使えば減算のかわりに加算で処理ができるが、それだけではなく「負の値を表す」
ためにも使用される。  ̄ ̄ ̄ ̄ ̄ ̄
例えば8ビットで表現できる数は次のようになる。
ビット列 10進数
00000000 → 0
00000001 → 1
00000010 → 2
:
01111110 → 126
01111111 → 127
10000000 → 128
10000001 → 129
:
11111110 → 254
11111111 → 255
上記のように0〜255が表現できる。
しかし、負の数を表現する必要があり、そこで負の数は2の補数を使用する。
2の補数を求めるには0と1を反転して次に1を加えるという操作を行った。
10進数1の「2の補数」を求める
2進数で10進数1を表すと 00000001
0と1のビットパターンを反転する ↓↓↓↓↓↓↓↓
11111110
1を加算する + 00000001
────────────
このビット列が−1 11111111
同様に10進数2の「2の補数」を求める
2進数で10進数2を表すと 00000010
0と1のビットパターンを反転する ↓↓↓↓↓↓↓↓
11111101
1を加算する + 00000001
────────────
このビット列が−2 11111110
以下同様に計算すると次のようになる。
ビット列 10進数
11111111 → −1
11111110 → −2
11111101 → −3
11111100 → −4
:
10000010 → −126
10000001 → −127
10000000 → −128
以上より、ビット列と10進数の対応は次のようになる。
ビット列 10進数
00000000 → 0
00000001 → 1
00000010 → 2
:
01111110 → 126
01111111 → 127
10000000 → −128
10000001 → −127
:
11111110 → −2
11111111 → −1
ところで、同じ10000001という2進数でも、それが正の値である129なのか
それとも負の値である−127を表しているのかが区別できないように思える。
それは、上記例からもわかるように2進数の最上位桁が1のものは負の値を補数で表している
ことになる。
これらの考え方はビット数に関わりなく適用できる。
又、上記8ビットの例から2の補数を使ってnビットで表現できる整数の範囲は
−2^(n−1) 〜 2^(n−1)−1 となる。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
例)
上記例のn=8の場合
−2^(n−1) =−2^(8−1)
=−2^7
=−128
2^(n−1)−1=2^(8−1)−1
=2^7−1
=128−1
=127
よって、−128〜127 となる。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
【固定小数点の形式】
8 7 6 5 4 3 2 1 第8ビット:8(=2^3)の位
┌─┬─┬─┬─┬─┬─┬─┬─┐ 第7ビット:4(=2^2)の位
│ │ │ │ │ │ │ │ │ 第6ビット:2(=2^1)の位
└─┴─┴─┴─▲─┴─┴─┴─┘ 第5ビット:1の位
↑ 第4ビット:1/2の位
小数点位置 第3ビット:1/4の位
第2ビット:1/8の位
第1ビット:1/16の位
┌─┬─┬─┬─┬─┬─┬─┬─┐
0の場合 │0│0│0│0│0│0│0│0│
└─┴─┴─┴─▲─┴─┴─┴─┘
┌─┬─┬─┬─┬─┬─┬─┬─┐
1の場合 │0│0│0│1│0│0│0│0│
└─┴─┴─┴─▲─┴─┴─┴─┘
┌─┬─┬─┬─┬─┬─┬─┬─┐
2の場合 │0│0│1│0│0│0│0│0│
└─┴─┴─┴─▲─┴─┴─┴─┘
┌─┬─┬─┬─┬─┬─┬─┬─┐
0.5の場合 │0│0│0│0│1│0│0│0│
└─┴─┴─┴─▲─┴─┴─┴─┘
┌─┬─┬─┬─┬─┬─┬─┬─┐
2.25の場合 │0│0│1│0│0│1│0│0│
└─┴─┴─┴─▲─┴─┴─┴─┘
例)
−2.75の場合
上記例より2.75を8ビットの固定小数点形式で表すと次のようになる
8 7 6 5 4 3 2 1
┌─┬─┬─┬─┬─┬─┬─┬─┐
│0│0│1│0│1│1│0│0│
└─┴─┴─┴─▲─┴─┴─┴─┘
この値に基づき2の補数を求める。
00101100
0と1を反転する ↓↓↓↓↓↓↓↓
11010011
次に1を加算する + 00000001
────────────
11010100
よって、−2.75は次のように表される。
8 7 6 5 4 3 2 1
┌─┬─┬─┬─┬─┬─┬─┬─┐
│1│1│0│1│0│1│0│0│
└─┴─┴─┴─▲─┴─┴─┴─┘
↑
小数点位置