2011年1月29日土曜日

数値データの表現


4ビットのコンピュータがあるとして、数値はどう表現するのか?


小生の場合、素直に次のような15種類の数かなぁー 
なんて考えました。


0000    ……   0
0001    ……   1
0010    ……   2
0011    ……   3
0100    ……   4
0101    ……   5
0110    ……   6
0111    ……   7
1000    ……   8
1001    ……   9
1010    ……  10
1011    ……  11
1100    ……  12
1101    ……  13
1110    ……  14
1111    ……  15

でも、これではプラスの数(正の数)しか表せないし、
どうやってマイナスの数(負の数)を表現するのだろうか? 
と。

随分と昔に、
”符号ビット” なんて言葉は聞いたことがある。
それってこういう事だよなぁー と、下のように
軽く想像していました。 




1010    ……  10
1001    ……   9
1000    ……   8
0111    ……   7
0110    ……   6
0101    ……   5
0100     ……    4
0011    ……   3
0010    ……   2
0001    ……   1
0000    ……   0
1001    ……  -1
1010    ……  -2


実際, 上のように書いてみて、あれっ! 
と感じました。

-1 と -2 ( 1001 1010 ) は、
それぞれ 
+9 +10 ( 1001 1010 )と一緒じゃないか!


今更ながら、自分がイメージしていた事は、
全くめちゃくちゃなものだったと 我ながら
呆れてしまった。 

きちんと基礎を理解せねば、資格なんて
取れる訳がない!  そう痛感する。

小生が手にしたテキストで、
「FOM出版 よくわかるマスター 基本情報処理技術者試験 
 対策テキスト」 が最も取っつき易かったので、それをベース
に勉強を開始した。 このテキストは比較的優しく、又、解説
もそれなりに詳しいとは思うのだが、数値の正負の表現方法
の解説(P25)で難しくなってきた。

正の数値と負の数値の表現方法には、
①絶対値表現  と
②補数表現    と言うものがあるらしいのだが、

先ず、絶対値って何でしょうか? 言葉の意味を理解
しないと気が済まないタチなのでググってみたら、

X≧0 のとき、 |X|=X 、X<0 のとき、 |X|=-X

だそうです。 具合が悪くなってきます。

テキストには、
「最上位のビットを符号ビットとし、正の場合は
0、負の場合は1と表現する方法のこと」
とあります。素直にそれで満足することにします。

000 0011  ……   3
000 0011  ……  ー3
 (絶対値表現で表した例)

 ※8ビットで考えると、左の1ビットで正負を表し、
   右7ビットで数値を表す。


次は補数表現。 これは参った。
補数という概念は高校の数学で学習していたらしい
のだが全く記憶にない。 また、小生にはテキストの
解説(下記 参考)が全く理解できなかった。

参考 ーーーーーーーーーーーーーーーーーーーーーーー
「補数」とは、ある数値の桁をひとつ繰り上げるために加算
する数値のこと。たとえば、6+4=10であることから、6の
補数は4である。 
ーーーーーーーーーーーーーーーーーーーーーーーーーー 
※テキストより抜粋


6時間以上、悩んだ結果、上の解説は正しいことを理解した。
どうも、小生は見当違いの思考を巡らしてしまうようだ。
要するに、補数とはある数に何らかの数をたして、計算し易い
ように工夫する技術のようです。

コンピュータでは2進数で計算を行っているので、
2進数を例に示します。 


1の補数
コンピュータ(8ビット)が負の数値を表すのに、”1の補数”
を使用するものと定義している場合。数値3 及び ー3 は
次のようになります。

0000 0011  ……   3
1111 1100  ……  ー3   
1111 1111  ……   0 ← なぜ11111111 は 0? 


※1の補数で負の数を表す場合、1111 1111 は
  0の意味を持たせています。


当初、1111 1111 が 0 を意味することが理解でき
なかったのですが、 実際に一覧表を作ってみると。
「なるほど」と、納得できました。



     数値    反転   1の補数
 0  0000    →     1111 ← ゼロの意味を持たせる
 1  0001     →     1110
 2  0010    →     1101
 3   0011    →     1100
 4   0100    →     1011
 5   0101    →     1010
 6   0110    →     1001
 7   0111    →     1000



              負の意味を持たせる


(※4ビットで考えます)


負の数を”1の補数”で表すコンピュータ(4ビット)は、
元のデータ(正)を単純に反転しただけの値を、
負のデータとする事としています。

例外といえる事は、正でも負でもない数値 ”0000” を
反転した場合”1111”となりますが、これを負の数とは
しない事ですね。 
  まぁ、データを反転する事で、符号の正負を逆にしよう
とする仕組みですから、正でも負でもない数値”0000”
を反転させて負の値にしてしまっては矛盾が生じますし、
 1・0 のデータを反転させるだけでしたら、比較的簡単
に変換できるだろうし、よく思いついたものだと感心させ
られました (小生の感想はどうでもよいですね)。
 そんなことで、”0000” と ”1111” の両者には ”0” の
意味を持たせているようです。

さて、4ビットコンピュータがあるとして、「1の補数方式」
で表現できる数値の種類は、1~7 と -1~-7 、そして
 0 ですので、15種類となります。

当然ビット数が大きくなれ表現できる種類も大きくなり
ますので、「1の補数方式」で可能な組み合わせ数は、
「 -2n-1 ~ 2n-1 -1 」 の公式で求めることができます。


 次回は、ほとんどのコンピュータで採用されている、
2の補数方式 』についての概念をまとめます。






情報処理再チャレンジブログ ホーム

0 件のコメント:

コメントを投稿