前記例は、引く数 が 引かれる数 より小さい場合、言い換えると答えが10進数的にプラスである例でした。10進数的にマイナスになるはずの計算を行ってみます。
0 | 0 | 1 | 1 | ||
- | 1 | 0 | 1 | 0 | |
? |
前記例と同様に
( 0011 - 1000) - 0010 と考えます。
0 | 0 | 1 | 1 | 10進数では引かれる数が引く数より小さい場合はマイナスの答えになります。 しかし、2進数にはマイナスは有りません。この場合は存在していない上位桁より借りてきたものとして計算を行います。 | |||
- | 1 | 0 | 0 | 0 | |||
よって
1 | 0 | 0 | 1 | 1 | 1は本来存在しない値です。あくまで有るものとして計算するだけです。 | ||
- | 1 | 0 | 0 | 0 | |||
1 | 0 | 1 | 1 | ||||
- | 0 | 0 | 1 | 0 | |||
1 | 0 | 0 | 1 |
ここで10進数的に考えると矛盾が有るように思われます。
2進数 0011 - 1010 = 1001
10進数換算 3 - 10 = 9 ?
10進数的に考えると -7 のはずです。
以前にも記しましたが、2進数の読み方はそれを使うものによって決定されます。
つまり、この場合 1001は 9 でもあり -7 でもあるわけです。
For engineer
|
2進数の計算を一旦10進数に変換しながら計算を行って行くと、多々不思議なことが起こります。それは2進数をどの様に利用したいのか利用者が理解していないためです。これを防ぐために、2進数は2進数で頭の中でも計算できるようにすることが必要です。
検算をおこなってみます。
0011 - 1010 = 1001 の検算は
0011 = 1010 + 1001 が確認できればOKです。
1 | 0 | 1 | 0 | ||
+ | 1 | 0 | 0 | 1 | |
0 | 0 | 1 | 1 |
結果は 10011。しかし、4ビット長の計算なので、有効ビット長は4ビット、5ビット目は捨てられ 0011。
引き算が正しいことが確認できます。