この記事は、絵でわかる プログラムとは何か(5)~データ~ の最初に読んでいただくべき記事です。
この記事のポイント
- コンピューターが扱う最も基本的なデータはON/OFFパターン、つまり2進数としての数値。
- 数値でも、一定範囲の自然数は簡単に2進数化できるが、負数や小数などは、別途工夫が必要。
- メモリアドレスも、自然数であり、そのまま2進数として扱える。
- メモリアドレスをオペランドとして、そのアドレス位置に記録されたデータを処理することを参照と言う。
- 逆に、オペランドに入れられた数値をそのまま処理対象とすることを即値と言う。
- 即値か参照かは、オペランドを見ても区別付かず、オペコードで区別が付けられる。
数値
元来コンピューターは、電気のON/OFFパターンを入力したら、それを論理回路に通した結果のON/OFFパターンを出力するだけの計算機でした。その本質は、実は今も変わっていません。
よって、コンピューターが扱う最も基本的なデータはON/OFFパターン、つまり2進数としての数値になります。そして、数値でありさえすれば、2進数というのは単に表記法の一つでしかないので、数値なら10進数でも何進数でも、2進数に可逆変換して、間接的にコンピューターで扱えることになります。
ただし、単純な10進数⇔2進数の変換ができる数値は、記号を使わない自然数(正の整数およびゼロ)に限られます。
マイナス記号が必要な負数、小数点記号が必要な小数などは、別途、効率よく変換したり計算したりできる工夫が必要になります。
アドレス
データを一時的に入れておくメモリには、その記録単位(通常は8ビット=1バイト単位)ごとにアドレスが割り当てられています。そのアドレスも、先頭から順番に0, 1, 2, 3, ・・・と割り当てられた数値なので、コンピューターで扱うことができます。

それでは上図のように、メモリアドレス 2番地(00000010番地)に、00000100 (10進数の 4 )が記録されている場合を考えてみましょう。
- 2進数の 00000010 は、10進数の 2 です。
- 2進数の 00000100 は、10進数の 4 です。
このメモリ状態で、オペランドとして 00000010 を指定した場合、どんな結果が出力されてくるのでしょうか?
NOT計算回路の例
例えば、各ビットの 0 と 1 を反対にする NOT 計算回路になるように論理回路を組み替えるオペコードを 10000000 として、
NOT 2
つまり、

の2行を順次、プロセッサへ入力した場合を考えていってみましょう。
オペランドは数値か?アドレスか?
数値として見た場合
2行目の 00000010 をそのまま数値として見るなら、2 を処理することになり、
NOT 2 の結果は、11111101 になります。
計算の結果の出力先は、アキュムレータ(accumulator)と言われる計算結果専用のレジスタが、プロセッサの標準仕様で用意されています。
このため、オペランドでは特に指定していません。
これをそのまま10進数に直すと 253 。2の補数を使って、128以上の数を負数として見るなら、-3 になります。
負数の扱いについては、2の補数で詳しく説明します。NOT論理回路の結果は、それに +1 を足すだけで、元の数値にマイナスを付けた数値と同じになります。
つまりNOT論理回路は、足し算から引き算を生み出す、重要な論理回路なのです。
アドレスとして見た場合
一方、これをアドレスとして見るとどうでしょう?

2番地 に記録された中身の 00000100 、(10進数の 4 )を処理することになり、
NOT 2 の結果は、11111011 になります。
これをそのまま10進数に直すと 251 。2の補数を使って、128以上の数を負数として見るなら、-5 になります。
参照と即値
このようにオペランドで、処理対象のアドレスを指定することを、参照(reference)と言います。
逆に、オペランドへ直接入れられた処理対象を即値(immediate)と言います。
テレビ放送に例えるなら、参照は生中継、即値は録画のようなものです。
参照(生中継)は、刻一刻と変わる現場が見え、見る側から現場を動かすことも出来ます。(制限される場合もあります)
即値(録画)は、現場とは別の複製であり、記録として残せます。録画内容の編集はできても、現場は動かせません。
実際のオペランドには、処理対象の数値を入れて直接処理する即値よりも、むしろ処理対象のアドレス数値を入れて、そこへアクセスしてから処理する参照の方が多くなっています。その方がプログラムを書き換えずに、データの入れ替えだけで異なるデータを処理できて、便利だからです。また、即値で扱えるデータの大きさは、せいぜい1~数バイト程度が限界なので、大きなデータはたとえ入れ替えることがなくても、もともと即値で扱うことができません。
オペランドの扱い方は、オペコードの仕様の一部
ただしマシンコードでは、オペランドに「番地」のような目印をつけて数値かアドレスかを区別させることはできません。オペランドを数値として扱うか/アドレスとして扱うか は、その直前に入力されたオペコードによって決められます。
また、オペランドにメモリアドレスではなく、複数あるレジスタの中から1つを指定するマシンコードが入れられるのも、参照の一種と考えられます。
この記事のまとめ
コンピューターが扱う最も基本的なデータはON/OFFパターン、つまり2進数としての数値です。
数値でも、一定範囲の自然数は簡単に2進数化できますが、負数や小数などは、別途工夫が必要になります。
メモリアドレスも、自然数であるので、そのまま2進数として扱えます。
メモリアドレスをオペランドとして、そのアドレス位置に記録されたデータを処理することを参照と言います。逆に、オペランドに入れられた数値をそのまま処理対象とすることを即値と言います。
即値か参照かは、オペランドを見ても区別付かず、オペコードで区別が付けられます。
次は、文字入出力 に進みましょう。
この記事は、絵でわかる プログラムとは何か(5)~データ~ の一記事です。
コンピューターのしくみ全体を理解したい場合は、以下の2コースがお勧めです。
日本全国 オンラインレッスン にも対応しています。
知りたいことだけ単発で聞きたい場合は、 オンラインサポート をご利用ください。