※ 準備 : 学籍番号を入れて「入力」をクリック (タップ) してください。
\(A=(\)
\()_2\) のとき、\(-A\) を8桁の2進数で書いてください。また、\(A\) を10進数に変換してください。
課題1解説
動画の解説を参照
4ビットの2進数 \(A, B\) があるとき、前項で見た方法で \(-B\) を作り、\(A\) と \(-B\) の足し算を行えば \(A-B\) がもとめられます。
例えば
\(A=(5)_{10}=(0101)_2\)
\(B=(3)_{10}=(0011)_2\)
なら、
\(-B=(-3)_{10}=(1101)_2\)
になるので、\(A-B\) はこのようになります。
|
|
1 |
0 |
1 |
| + |
1 |
1 |
0 |
1 |
| 1 |
1 |
|
1 |
|
| 1 |
0 |
0 |
1 |
0 |
計算結果のうち下から (右から) 5ビット目の位は無視します。すると \((0010)_2 = (10)_2\)、つまり「5-3 = 2」の計算ができたことになります。
結果が負になる場合でも同様にできます。例えば
\(A=(3)_{10}=(0011)_2\)
\(B=(5)_{10}=(0101)_2\)
なら、
\(-B=(-5)_{10}=(1011)_2\)
になるので、\(A-B\) はこのようになります。
|
|
|
1 |
1 |
| + |
1 |
0 |
1 |
1 |
|
|
1 |
1 |
|
|
1 |
1 |
1 |
0 |
この結果、\((1110)_2\) は負の数で、その補数は \((0010)_2 = (2)_{10}\)、つまり \((1110)_2 = (-2)_{10}\) なので、「3-5 = -2」の計算ができたことになります。
ただし、この方法がうまくいかないこともあります。
\(A=(7)_{10}=(0111)_2\)
\(B=(-4)_{10}=(1100)_2\) → \(-B=(4)_{10}=(0100)_2\)
の場合は、正しい計算結果は「7-(-4) = 11」ですが
で、\(A-B\) は
となり、\((1011)_2\) は負の数で、その補数は \((0101)_2 = (5)_{10}\)、つまり \((1011)_2 = (-5)_{10}\) で、本来の値とは違う結果になってしまいます。
原因は、本来の計算結果が「符号付き4ビット」で表現できる範囲、つまり -8~7 の範囲外にあるためです。
これを
オーバーフローと呼びます。
オーバーフローが起こるかどうかは、繰り上がりの組み合わせでも判定できます。
\(n\) 桁目の計算で起こる繰り上がりを \(C_n\) とすると、オーバーフローの有無はこのようになります。
| \(C_3 \backslash C_2\) |
0 |
1 |
| 0 |
なし |
あり |
| 1 |
あり |
なし |
\(A=(\)
\()_{10}\), \(B=(\)
\()_{10}\) として、
概要の方法で \(A-B\) の計算を行い、普通に10進数の引き算を行った場合と結果を比較して正しいかどうかを確認してください。
課題2解説
動画の解説を参照
前回紹介した加算回路を使えば、引き算を行う回路が作れます。
\(-B\) は \(B\) の 0, 1 を反転させて 1 を加えたものなので、このような回路で A3~A0 に引かれる数、B3~B0 に引く数を設定すれば引き算ができます。
概要のリンク先の回路を開き、課題2の \(A, B\) に応じて A3~A0, B3~B0 を切り替え、出力 S3~S0
が課題2の計算結果とあっているかどうかを確認し、そのスクリーンショットを撮ってください。
課題3解説