基礎知識

パソコンの引き算 - なぜ補数を取るとマイナス表現になるのか

 とっても古い『栢木先生の基本情報技術者教室』を読んでいて、負数の表現がさっぱり分かりませんでした。
 それぞれのビットを反転させ、1を加えることによって「2の補数」を作れば負数が出来上がるというのは説明がありますが、では、そうすることによって、なぜマイナスが足し算で可能になるのでしょうか。
 この説明ではさっぱりわかりません。

 この説明は、令和2年度版でも同じようなものです。
 毎年改定がある人気書なのに、初学者には分かりにくいこのようなところは、なんで何年も前から説明が全く変わらないのでしょうかね。
 新しい知識の部分だけが少しばかり書き換えられて、基礎知識の説明は、一向に昔のまんま。
 逆に言えば、これだから、基本部分の作りがしっかりしている栢木先生の本は、数年前の古本でも、概要をつかむくらいなら、結構遜色なく使えるのです。

 説明通り丸暗記をすれば、その場は計算できるかもしれませんが、感覚的にすっきり納得がいっていないと、そんな記憶が長続きして役に立つはずがありません。

ある数と、補数を足し合わせると 0 になる

 「2の補数」とは、元の数と足し合わせて、与えられた数の最大値より1大きくなる数なので、元の数と足し合わせると、桁上がりします。
 例えば8ビットなら、9ビット目が1になり、8ビット目以降はすべて0になります。パソコンは、指示されたこと以外はしませんから、8ビット目までの演算が指定されていれば、9ビット目がいくら桁上がりしていても、8ビット目までしか感知しません。9ビット目は無視されます。
 ということは、「1+(-1)=0」と、一つの数と、その数のマイナス表現である補数を足し合わせると、必ず 0 になります。
 足し合わせて 0 になるということは、同じ数のマイナスが表現できたということです。
 そして、下の表を見ると、どの段階でも、一つ下に下がれば、1ずつ数値が下がっていくのが分かります。すなわち -128 から +127 までの範囲でだけなら、これでうまくマイナスの計算ができたということです。
 指定された範囲内でのみ、このやり方が有効になるのですから、この範囲を逸脱する答えになるときは、この足し算の結果は、当然でたらめになってしまいます。
 8ビット目を見ると、プラスは 0 、マイナスなら 1 になっています。「マイナス同士を足し合わせて、8ビット目が 、「1+1」で0 になることは無いのか」という疑問が浮かんできますが、そのような場合は、計算結果が「-128 から +127 までの範囲」を逸脱しているからのようです。結果が範囲にとどまっていれば、下からの桁上がりによって、必ず8ビット目も桁上がりし、「1+1+1=1」になるようですね。

10進数 2進数
+127 01111111
+126 01111110
+3 00000011
+2 00000010
+1 00000001
0 00000000
-1 11111111
-2 11111110
-3 11111101
-126 10000010
-127 10000001
-128 10000000

プラスとマイナスとで絶対値で表現できる範囲が異なる

 プラスは、+127 まで、マイナスは -128 までと、表現できる絶対値の数値は異なります。
 見てみると、-128 は、0 の対で、8ビット目だけが1になっているバージョンの様です。0 は正に入りますから、正は、「127から0」までで128個、負は、「-1から-128」まででこちらも128個です。

 本屋で立ち読みしながら、平成23年度のと今のとで、栢木先生の本は、あまり説明部分は変わっていないようなので、改めて買い直す必要性をあまり感じていなかったのですが、令和2年度秋の試験が延期されたので、栢木先生の本を使って、素早くもう一度最近の内容を含めて、知識の整理をしたくなったので、半分「無駄かな」と思いながら、昨年度版も手に入れてみました。
 両者を見比べてみて、大きな違いは、例題を最近のものに差し替えているぐらいで、説明は概ね同じでした。ビジネス用語などを中心に、若干の用語を補足するといった改定がなされているようです。
 しかし、ちょっと気になるのは、23年のには入っていた、+127から-128までの上の2進数の表が、令和1年度版では消えていることです。(バイアス127の説明なども)
 ページ数の都合なのでしょうが、この表は、他書には載っていないものも多くて、栢木先生の本の良いところの一つだっただけに、改定のあり方は、もう少し慎重にしてほしいものだと思います。
 毎年改定している割には、新しい用語についても、あまり本気で加えていこうとしているようにも見えませんし。

固定小数点の負数

平成23年秋期 問2
10進数-5.625を,8ビット固定小数点形式による2進数で表したものはどれか。ここで,小数点位置は3ビット目と4ビット目の間とし,負数には2の補数表現を用いる。

小数点位置画像
  1. 01001100
  2. 10100101
  3. 10100110
  4. 11010011



 まず、5.625を2進数にします。
 小数点がある場合は、小数点以上と以下とで、別々に2進数に直します。
 5=101
 0.625=0.101
 これをつなげた数を、枠に当てはめて書くと
 0101.1010
 補数を取って(各ビットを反転させて、最後の桁に1を加える)
 1010.0110

 解答:3
 補数にする時には、小数点以上と以下とで、別々に補数を取るのではなくて、小数点以下もつなげた数の補数を取らないといけないようです。
 まあ、考えてみれば、そうしないとコンピューターは、うまく計算できないでしょうね。こうしておけば、小数点の桁の位置をずらすだけで、小数点がない場合と同じように計算を処理することができるので。
 元々、「固定小数点数は、『ビット列のどの位置に小数点があるか』を暗黙的了解として扱う表現方法」(『キタミ』)ですから、コンピューターは、1011010 や 10100110 の計算をしているだけです。

本当に知識がないものには順を追って説明してくれないと

 本当に知識がないものには順を追って説明してくれないと、理解できません。
 小学校の教科書を見ていると、足し算を教えるのにも、

  • 繰り上がりのない一桁の足し算
  • 繰り上がりがある1桁の足し算
  • 2桁目だけが繰り上がる2桁の足し算
  • 1桁目も2桁目も繰り上がる2桁の足し算
  • 3桁以上の足し算

と細かく順を追って説明してあります。
 一般の人が、子ども(他人)に算数を教えることが出来ないのは、これらのことを自分はもう既に知って感覚的にやっているので、その理解の段階の違いを細かく把握できていないからです。
 基本情報の教科書も、「分からない人に向けてきちんと分かるように解説してある」ものは、数ある中の一握りの様です。

タイトルとURLをコピーしました