目次

補数を減算で求めるのでは減算を加算で行うことにならない

生徒のみなさん、ここは笑うところです

「情報の科学」のある教科書の記述です。補数を使うことでコンピュータの内部では、減算もすべて加算で行われているということを説明している部分です。他の教科書に比べてこの記述は詳しく力が入っていますが、根本的にピントがずれています。

以下、このような色と字体で表示された部分は教科書の記述をそのまま引用した部分です。その他は私がまとめた部分と、意見です。1. コンピュータの内部で...などは教科書にある見出しです。

1. コンピュータの内部での負の数の表現

コンピュータの内部では、減算もすべて加算で行われている。と最初に謳う。

2桁の10進数のカウンタ(00から01,02,...と回転して99の次に00に戻る)を使って99を-1と見なせることを説明。

よって、この10進数カウンタでは、正の整数は1〜49、負の整数は-1〜-50を表現できると続く。1〜50,-1〜-49でない理由は言わない。

このような負の数の表し方を補数表現という。例えば、10進数2桁で補数により-2を表現する場合、補数は100-2=98で計算でき、98が負の整数の-2となる。と引き算で補数を計算する方法を説明する。

例題1 2進数での数の表現

次に2進数に進み、3桁の2進カウンタを使い、正の整数は001〜011、負の整数は111〜100を表現できると続く。この場合も011/100で正負を区切る根拠は言わない。

2. 補数を使った計算

次に2の補数の求め方を説明している。

まず、10進数同様、引き算で求める例を示した後、

2進数の場合は01反転のあと+1でも求めることができると書いている。

ここまででまずい所を挙げると次のようになるが、今の所、致命的なものではない

このあとこれまでくすぶっていた矛盾が爆発する。

例題2 補数を使った計算

10進数で補数を使った7-4の計算を参考にして、2進数で補数を使って(111)2-(100)2の計算をしてみよう。

考え方 10進数での計算

10進数なので10-4で補数を求め、7に足して桁上がりを無視すると、3となる。

解答 2進数での計算

(100)2に対する補数は、(1000)2-(100)2=(100)2となる。

次に、(111)2と補数である(1000)2を足し、桁上がりを無視すると、
((111)2+(100)2)-(1000)2=(1011)2-(1000)2=(0011)2となる。

考察

補数を用いることにより引き算が足し算になり、コンピュータの内部の演算回路は簡単になる。

この例題と解答には、いろいろ問題を感ずる。

ここの失敗は10進数での例にこだわったことだろう。まず10進数でやることでわかりやすくなるとは思えないが、10進数で補数を求めるには引き算をするしかないので同様にやろうとするとこうなってしまう。

有限桁で計算せざるを得ないのは、コンピュータにとっては、ある意味弱点なのだが、それを逆手にとってメリットにしている所がポイント。桁数を意識することはとても大切。

新課程「情報の科学」の教科書の表記の比較

2の補数を使って減算を加算で済ませる工夫は画期的な発明だったと思う。そして2進数の計算を実習で面白いと思えるのはここぐらいだと思うのだが、これを丁寧に扱っている教科書は意外に少ない。

それだけに、この説明はとても残念に思う。

出版社 記号番号 書名 教科書内の記述 私の意見
東京書籍 情科301 情報の科学 整数は小数点が右端に固定された方式で、固定小数点表現という。最上位ビットは符号を表し、0の時は正、1の時は負となる。負の数は、2の補数表現と呼ばれる符号化が一般的である。(2の補数表現の説明は反転後+1と傍注) 固定小数点とみなせるけれども整数は整数でしょう。
最上位ビットが符号を表さない方式もあるので、2の補数表現と呼ばれる符号化が一般的でその場合は最上位ビットは符号という順序がいいでしょう。
実教出版 情科302 最新情報の科学 「コンピュータの内部では、減算もすべて加算で行われている」ということを2ページを使って説明している。他の教科書に比べ詳しいが、今回問題にしたのはこの教科書。 十進を例にして導入した関係だろうが、補数を引き算で出している。2進では01の反転後+1の説明もしているのに練習問題で引き算を使ったのはまずい。
実教出版 情科303 情報の科学 8421のカードの組み合わせで数を表し、2進数と対応づける説明。負の数は扱わない。
数研出版 情科304 高等学校情報の科学 コンピュータの中では、負の数に「-」をつけずに正の数とは異なる方法で表される。たとえば8ビットであれば、それより1ビット長い100000000(2)という数を「0」と考える。-1はこの「0」より1小さい数であるから... これは正の数も負の数と同様の扱いをしているので「正の数とは異なる方法」というところは納得できないが、仮定が「100000000(2)という数を「0」と考える」ということだけなので理解しやすいかもしれない。ただ、コンピュータの仕組みを学ぶという観点からは面倒でもオーバーフローが理解できる方がいいような気がする。
符号ビットの説明が後になっているのは好ましい。
日本文教出版 情科305 情報の科学 現在では、負の数を表現するために、すべてのビットが1の数を-1と見なす2の補数を用いる。負の数に2の補数を用いることで、減算を加算で処理することができるようになる。補数を用いる計算では、桁数を最初に決めておく必要がある。 補数の算出の仕方は1の補数も説明し、1の補数+1が2の補数であると傍注で述べている。引き算で求めることは説明していないのが好ましい。「桁数を最初に決めておく必要がある」という一文も懇切丁寧ではないが省かないのが良い。2進数の減算をそのまま減算でやる場合と2の補数を使う場合を並べて比較しているので文章では説明不足でも教えやすいかもしれない。