- 締切済み
補数を利用した引き算について
こんにちは。 『2進数で 111 - 010 を計算をせよ。』 という問題があります。 つまり10進数でいう所の 7 - 2 = 5 の計算をします。 補数を利用すると引き算が足し算ででき、演算が簡単になることを 本は説明しようとしてるのですが、腑に落ちない点があります。 解説では --------------------------------- 引く数 010 の補数を求めると 101 なので 111 +101 -------- 1101 ↓ 101 よって桁上がりを無視した 101 が答え --------------------------------- との事ですが疑問に思うことがいくつかあります。 I. 上記の計算では3ビットであることが前提になっています。 7 - 2 = 5 をしたいわけですから、そうすると 111 ←符号なしの表現 ( 7 ) +101 ←符号付きの表現 ( -2 ) -------- 1101 ↓ 101 ←符号なしの表現 ( 5 ) となり、符号なしと符号付きの数値を混ざってしまうが、良いのでしょうか? また、この説明の仕方だと答えが 0~7 になる答えしか出せません。つまり引く数の方が大きいと計算できません。 私は補数を使うのであれば正の値・負の値、全て符号付きの値でなければいけないと思っていたので、 もし私が説明するのであれば全て符号付きにし、そして符号付きで7を表せるようにするために4ビットにして 0111 ←符号付き( 7 ) +1110 ←符号付き( -2 ) ---------- 10101 ↓ 0101 ←符号付き( 5 ) とするのであれば納得できます。 答えの範囲も -8~7 と負の値も許容できます。 II. 実際には 本のように引く数だけを補数にして足し算をして答えを求めているのか、 それとも私のように正の値・負の値、ともに符号付きの表現にして足し算をしているのか、 もしくは、いずれとも違うのか、どうなのでしょうか? また、参考文献などがありましたらご紹介お願いします。 以上ですがよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- ymmasayan
- ベストアンサー率30% (2593/8599)
No.2です。 もう充分にお判りになっているようですね。 最後に1点だけ補足。 10進数1桁で7-2を補数を使ってやること自体がルール違反です。 10進数1桁で補数を使うなら使える範囲は-5~+4でないといけません。 7も2の補数-8もこの範囲を外れています。 暗算で簡易計算するときにはこういう方法も良く使いますが。 正確には07-02=07+(98)=105→05 とすべきです。補数の頭が9で-をきちんと表しています。 文献は補数に直すところと加算とは大抵別々に書いてありますね。
- jjon-com
- ベストアンサー率61% (1599/2592)
>補数について専門的に書かれているもの >コンピュータ内部の実際の処理について書いてあるもの http://ja.wikipedia.org/wiki/補数 http://ja.wikipedia.org/wiki/加算器
- ymmasayan
- ベストアンサー率30% (2593/8599)
私も本がおかしいに1票。 111が正で101が負と言う所で既に矛盾ですね。 とにかく補数は色々と勘違いしやすいです。 4ビットにしておけば質問者さんの疑問は全て解決ですね。
- jjon-com
- ベストアンサー率61% (1599/2592)
その本の解説が間違っています。その執筆者は2の補数の加算による減算実現の仕組みを理解していません。 >補数を使うのであれば正の値・負の値、全て符号付きの値でなければいけないと思っていた >0111+1110=10101 →0101 あなたの理解が正しいです。
補足
早速の回答ありがとうございます。 上の問題の前に『補数を使って、10進数で 7 - 2 を計算せよ』 とあります。 そちらでは ----------------------------- 引く数 2 の補数は 8 。 7 +8 ---- 15 ↓ 5 よって桁上がりを無視した 5 が答え。 ----------------------------- とあります。 これと対比するように2進数についても書いているので、 最初のような解法になっているようです。 ただ、他の練習問題を見ても答えが必ず正の数になるものしかないので 著者も解説の疑わしい部分を判った上で書いているようにも感じます。
補足
早速の回答ありがとうございます。 補数について解説している(個人の)サイトを見てると この本と同様に、引く数だけを補数に直し、足し算をするという解説をしてるサイトもありますね。 参考文献はあるのかな、と思いながら読んでいますが。 算数的な話で、10進数の 7 - 2 を 7 + ( -2 ) として -2 の部分について補数を利用した引き算の解説なら、一つの解説方法だとは思います。 ですが、この本ではコンピュータ内部での2進数の補数について説明しようとしているので、 少々不適切な気がします。 補数について専門的に書かれているものが中々無いので困りました。 また、コンピュータ内部の実際の処理について書いてあるのも中々見つかりません。