AOBA's Information Processing Education
1997/12/14
注意1:このページは、回線を切断した後でゆっくりご覧になってください(テキストを印刷する場合は、その取り扱いに注意してくださるようお願いします)。
注意2:背景が白地の画面を長時間見つめていると頭が痛くなってしまいますので、ここは背景をグレーにしています。
コンピュータにおける数値データ表現には、固定小数点形式,浮動小数点形式,ゾーン10進形式,パック10進形式等があります。
「あれ、コンピュータの内部ではすべて2進数ではなかったの?」と、思った方も多いでしょう。
確かに、コンピュータの内部ではデータはすべて2進数で表現されています。ただし、同じ2進数であっても、ある場合(例えばパック10進形式の場合)の1は、別の場合(例えば固定小数点形式の場合)に28を意味する、というややこしいことが起きるのです。
ここではそんな面倒なことは無視して、この中で最も簡単な固定小数点形式の一部について解説します。固定小数点形式とは、小数点の位置が固定されている形式で、多くの場合、最も右のビット(の右)位置に固定された形式です(小数点が固定されている位置は必ずしも最も右とは決まっていませんが、ここではこのケースについてのみ解説します)。
以下の図を参照してください。なお、第5回講座までは、2進数の場合は明に(...)2と表現していましたが、ここでは(...)2を付けません。
![]()
ここで新たな用語、ビットが出てきました。
ビットとは、コンピュータにおけるデータ表現の最小単位であり、1ビットでもって0か1のいずれかを表現します。つまり、2進数の1桁が1ビットに当たるのです。上図は2進数で8桁ですので、これは8ビットのデータですね(ちなみに8ビットを1バイトともいいます)。さて、上図で示すデータが数値ならば、それが10進数でいくつかを考えてみましょう。
答えは簡単です。符号ビットが0の固定小数点形式の場合は、第4回目の講座で解説した2進数から10進数の基数変換を行うだけでOKです。
つまり、1×24+1×23+1×22=28 です。
次は符号ビットついての解説です。
我々現実の世界では、負の値を表現するのに”−”(マイナス)記号を用います。ところが、コンピュータ内部では0と1しかありませんので、これらの組み合わせでもって負の値を表現しなければなりません。
最初に結論を言えば、「あるデータが固定小数点形式で表現されている場合、符号ビット(最も左側のビット)が1ならば負数であり、それが0ならば0か正数である」です。そしてほとんどすべてのコンピュータは、負数を表現するのに、2の補数を用います(きわめて希に、1の補数をとるコンピュータもあるのですが、とりあえず無視)。またもや数学用語、2の補数が出ましたね。これ覚えてますか(ちなみに私は学校で習った覚えはまったくありません。寝てたのか?)。
ここで数学的な解説するつもりはありませんので、結論だけを言います。ある2進数nの2の補数は、nの全ビットを反転(0と1を逆転)させて、1を加えた値です。下図を参照してください。これは2進数の00000110(10進数で6)の2の補数を求める手順です。
![]()
(注)2進数では1+1=10になることに注意しましょう(2になると1桁繰り上がるから)。
ここから、00000110の2の補数は、11111010であることが分かります。そして逆に(これも重要)、11111010の2の補数は00000110です(自分で手順を試してみてください)。
ちょっと前に、ほとんどすべてのコンピュータは、負数を表現するのに2の補数を用いる、と説明しましたよね。だから、00000110は10進数で6なので、11111010は10進数で−6なのです(11111010の符号ビットが1であることに注意)。これをまとめます。
「固定小数点形式の数値データを10進数に変換する手順」
1.符号ビットが0ならば、2進数から10進数への基数変換を行う。この場合は正数(または0)である
2.符号ビットが1ならば、元の数値データの2の補数をとり、その値の2進数から10進数への基数変換を行う。この場合は負数である。以下に変換例を示します。これは、固定小数点形式の数値データの11110010を、10進数に変換する例です。
![]()
さらにこれまでとは逆に、10進数から固定小数点形式の数値データに変換する手順も覚えておきましょう。
「10進数を固定小数点形式の数値データに変換する手順」
1.元の10進数が正数(または0)ならば、10進数から2進数への基数変換を行う。
2.元の10進数が負数ならば、10進数から2進数への基数変換を行い、その値の2の補数をとる。「演習」
設問1
11100111が固定小数点形式の数値データの場合、これを10進数で表現するといくつになるか。設問2
10進数の−30を、固定小数点形式の8ビットのデータで表現するといくつになるか。(注)両設問ともに、小数点は最も右のビットの右位置とする。
演習の解答 設問1 −25 設問2 11100010
設問1について
11100111は符号ビットが1なので負数と判断し、2の補数をとります。
11100111の全ビットを反転すると→00011000
00011000+1=00011001(これが元の値の2の補数)
これを10進数に基数変換して、
1×24+1×23+1×20=25
したがって、求める答えは−25です。設問2について
−30は負数ですが、まずは30を2進数に基数変換します。
30÷2=15・・・・0
15÷2= 7・・・・1
7÷2= 3・・・・1
3÷2= 1・・・・1
1÷2= 0・・・・1したがって、(30)10=11110=00011110
(注)最終的な答えを8ビットで出しますので、先頭に0を補っています。次に、00011110の2の補数をとります。これが求める答えです。
00011110の全ビットを反転すると→11100001
11100001+1=11100010(これが求める答え)
最後に符号付き2進数という用語を覚えておいてください。
符号付き2進数というのは、最も左側の桁を符号とみなし、負数を2の補数(場合によっては1の補数)で表現した2進数の形式です(つまり今回解説したもの)。
これとは逆に、符号なし2進数というのもあります。符号なし2進数とは、その名の通り符号桁を持たない2進数であり、正数(または0)しか表現することはできません。第5回講座までは、暗黙のうちに符号なし2進数について解説していました。ちょっと今回は難しかったかもしれませんね。ではまた来週。