Think

頭をちょっと使ってみましょう

2進数 引き算 答えがマイナス?

2006-06-20 12:38:00 | 算数 2進数

前記例は、引く数 が 引かれる数 より小さい場合、言い換えると答えが10進数的にプラスである例でした。10進数的にマイナスになるはずの計算を行ってみます。

0 0 1 1
- 1 0 1 0


前記例と同様に
( 0011 - 1000) - 0010 と考えます。

0 0 1 10進数では引かれる数が引く数より小さい場合はマイナスの答えになります。
しかし、2進数にはマイナスは有りません。この場合は存在していない上位桁より借りてきたものとして計算を行います。
- 1 0 0 0

よって

1 0 0 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

unsigned
符号無し
signed
符号付
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 -8
1001 9 -7
1010 10 -6
1011 11 -5
1100 12 -4
1101 13 -3
1110 14 -2
1111 15 -1
プログラミング言語(特にC言語)では、数値に対して 符号付の signed と 符号無しの unsigned が存在します。 これは同じ2進数値であっても signed と unsigned とでは振る舞いが異なるため、この様に明示して、その振る舞いをプログラマ自体が理解する必要があると、プログラミング言語はプログラマに要求している訳です。

左表は、4ビット長の数値(変数、定数)が有った場合、Unsigned と Signed の違いを示したものです。
Unsigned は当然普通の換算ができます。Signed はトップビット(この場合は4ビット目)が1の場合に10進換算でマイナスとなり All 1 (全てのビットが1)の場合に -1 となります。

上記の計算の結果 10進イメージで は-7のはずですが、1001の9と言う結果になりました。これは差表の 1001の行を見ると Unsigned では 9 でも Signed では -7となっています。



2進数の計算を一旦10進数に変換しながら計算を行って行くと、多々不思議なことが起こります。それは2進数をどの様に利用したいのか利用者が理解していないためです。これを防ぐために、2進数は2進数で頭の中でも計算できるようにすることが必要です。





検算をおこなってみます。

0011 - 1010 = 1001 の検算は
0011 = 1010 + 1001 が確認できればOKです。

1 0 0
+ 1 0 0 1
1 0 0 1 1

結果は 10011。しかし、4ビット長の計算なので、有効ビット長は4ビット、5ビット目は捨てられ 0011。
引き算が正しいことが確認できます。



最新の画像もっと見る