コンピュータには「引き算」という概念ありませんというパワーワードを見ました。
だけど引き算はできる。さて、どうやるのか。
一旦、足し算からおさらいします。
1111
+ 101
------
10100
// 1 + 1 = 0(繰上げ1)
5-3を計算させたい場合は5+(-3)の計算ができれば、足し算と使って引き算と同じ結果を
得ることができるようです。
負の数の表し方
引き算を知らなくても、負の数を表現できれば足し算で答えを求められます。
条件
- 数値を8ビットで表すことにする(8ビットは2進数で8桁)
- 先頭の1ビットが0なら正の数、1なら負の数とする
例えば10進数の「3」を
正の数 0 0 0 0 0 0 1 1 ( 3)
負の数 1 0 0 0 0 0 1 1 (-3)
00000011 + 10000011 = 100000110
3と-3を足したら0にならないといけないのに上記はそうなっていません。
そこで補数という概念が出るそうです。
補数は言葉の通り「補う数」という意味。
例えば10進数で123という数字があったとします。
999 - 123 = 876 // 9の補数と呼ぶ
1000 - 123 = 877 // 10の補数と呼ぶ
999は3桁の最大値で、1000は次の桁に繰り上がる数です。
2進数では「1の補数」と「2の補数」の2つの補数があります。
例えば2進数で0011という数字があったとすると
1111 - 0011 = 1100 // 1の補数
10000 - 0011 = 1101 // 2の補数
4桁の最大値は1111で次の桁に上がる数は10000です。
2の補数を使って計算をしてみます。
00000011
+ 11111101
-----------
100000000
8ビットから溢れた9ビット目を無視すると00000000になる。
つまり0になります。
ある数値に対する2の補数表現は、負の値として使えます。
このことから、コンピュータは負の数を表すのに2の歩数を使うようです。
2の補数は次のように求めることができます
00000011 ( 3)
11111100 // 全てのビットを反転させる(0と1を入れ替える)
11111101 (-3) // それに1を加算する
引き算の流れ
5-3を2進数に変換して計算します。
0101 - 0011
+ (-0011)
+ 1101
0101 + 1101 = 0010(桁溢れした先頭のビットは切り捨て)
まとめ
この章はちょっと、しっくりこなかったので復習しようと思います。