←講義のツボメニューへ
第13回、第14回
【2003,11,13】
8 負の2進数
8,0 2進減算回路
2進加算回路は今までのように実現できるが、コンピュータの命令には当然ながら減算も必要である。
加算においてもデータが負の場合も当然あるがCPUのハードウェアとしては、加算回路だけを用意しており
減算回路を別に保有している例はない。しかし、命令としては「SUBTRACT」命令は存在する。実は加算回路を
うまく活用することにより減算を行うことが可能。
その種明かしとして2進数の負の表現方法に行き着く。
つまり「2’s Complement」方式と呼ばれる方法で2進を表現することで減算を加算回路によって実現できる。
(2’s Complement = 2の補数)
8,1 2’s Complement表現の具体例
2’s Complement方式では1番左の1ビットの意味が符合と2nの重みづけを兼ねた特殊な扱いになる。
ここでは説明上4ビットとし、符号ビット1ビット、データビット3ビットからなる2進数値データb3b2
b1b0とする。
この4ビットの2’Complementデータは10進数に対応させると以下のようになる。
-23b3 + 22b2 + 21b1 + 20b0
2’s Comp表現の意味
バイナリパターン (b3b2b1b0) |
10進 |
バイナリパターン (b3b2b1b0) |
10進 |
1000 | -8 | 0000 | 0 |
1001 | -7 | 0001 | 1 |
1010 | -6 | 0010 | 2 |
1011 | -5 | 0011 | 3 |
1100 | -4 | 0100 | 4 |
1101 | -3 | 0101 | 5 |
1110 | -2 | 0110 | 6 |
1111 | -1 | 0111 | 7 |
8,2 2’s Complementでの演算
加算回路はFAを4個つないだ普通の加算回路であり、最上位ビットも区別なしに加算する
8,2,1 データ部分の演算
ここでは4ビットデータa3a2a1a0とb3b2b1b0を加算しs3s2s1s0
になると考えるとする。
前節からわかるように最上位ビットを除いた3ビット(データ部分)は単純な2進数値データである。
よって単純に2進加算としてs3s2s1s0が答えとなる。
ただし、両者の加算結果が8以上になると3ビットでは表現できない。このときはs3へ向かって桁溢れキャリーc2が
発生する。その場合はs3との兼ね合いでオーバーフロー扱いとなるので注意する。
8,2,2 符号部分の演算
加算回路(ハードウェア)自体は最上位桁が符号ビットであるとの認識はなく単にデータビットの延長として扱う。
しかし、2’s Comp.の符号部分はデータビットとは異なり-2nが係っているがそうとは知らず+2nが係っている
と思って加算する。すると当然結果は誤るが、場合によっては正解のこともある。
そのためどの場合誤り、どの場合正解かを確認する。
(1)a3=0, b3=0c2=0の場合
これは正値+正値でデータは8以下のケース。加算回路はs3=0をそのまま正しい答えになる。
(2)a3=0, b3=0, c2=1の場合
これは正値+正値でデータが8以上のケース。よって正値でオーバーフローが発生する。
符号部加算回路は、c2=1が入るため、s3=1を出力する。
このままでは、マイナス符号であるように見える。これは、加算回路が本来は区別して扱うべき符号ビットにデータ部分
のオーバーフローを繰り入れたための誤りである。結果の判断を誤らないため、オーバーフローが発生したときは別の回路
でOVFフラグをセットして、オーバーフローが発生したことと符号ビットを誤っていることをプログラムに知らせる。
(3)a3=0, b3=1, c2=0の場合
(4)a3=0, b3=1, c2=1の場合
(5)a3=1, b3=1, c2=0の場合
(6)a3=1, b3=1, c2=1の場合
8,3 2's Complementでの減算
減算A-Bは加算A+(-B)に置き換えて実施すればよい
よって減算ではなく、Bから-Bを作ることに帰着する