苦しんで覚えるC言語

メモリの仕組み


メモリ?


メモリという単語は、コンピュータに興味のある人には馴染み深い言葉です。
このメモリに、コンピュータのデータが記憶されていることは、
コンピュータを良く知らない人でも聞いたことのある話だと思います。

一般人のコンピュータ知識としては、それで十分なのですが、
プログラミングをする場合には、それだけでは不十分です。
メモリがデータを記憶するのはどのような仕組みなのか、
それを、しっかりと理解しておく必要があるでしょう。

だからと言って、CMOSの構造を説明するつもりは毛頭ありません。
重要なのは、ハード的な仕組みではなく、ソフト的な概念です。
メモリとは、どんな仕組みでデータを蓄えておけるのか、
そして、プログラムでは、どんな方法でメモリを取り扱っているのかを説明します。

目次に戻る

超巨大な1列ロッカー


メモリの中には、非常に多くの電子部品が組み込まれていて、
その1つ1つが、自分自身の状態を持っています。
状態、すなわち、オンかオフである、ということです。

そして、電子部品の状態がオンならば1、オフならば0というように、
それぞれの部品が、1であるか0であるかを記憶しています。

これは、例えるならば、超巨大な1列ロッカーのような構造です。
その数は、10や100といった、常識的な数では済まされません。
メモリ64MBのコンピュータならば、5億個以上のロッカーが並んでいます。

そして、そのロッカーには、番号がつけられています。
また、1つ1つのロッカーは、荷物という状態を持っています。
荷物が入っていたら1、入っていなかったら0としてカウントしましょう。

コンピュータは、このロッカーに荷物を詰め込んで、数値を記憶します。
全ての数値は、1と0の組み合わせで記憶されています。
要するに、コンピュータは数値を2進数で記憶しているのです。

目次に戻る

CPUのビット数


ビットという言葉も、おそらく聞いたことがあるのではないでしょうか。
今、我々が使っているコンピュータは32ビットです。
今(原稿の執筆時期)は、AMD社の64ビットCPUが話題になってますが、
我々一般ユーザーが使うようになるのは、まだまだ先の話です。
※2017年の現在では、64ビットが一般的となっています

ところで、このビットとは、一体何のことなのでしょうか。
実は、今回のテーマである、メモリともとても深く関係しているのです。

先ほど、メモリとは、超巨大な1列ロッカーであると説明しました。
そして、数値は、2進数として記録されていると説明しました。
しかし、このデータは全て2進数で記録されていますから、
いちいち1つ1つのデータをやりとりしていてはとても面倒です。

そこで、誰でも思いつくのが、何個かまとめて使う方法です。
例えば、メモリのデータの内、8個をまとめて使うようにすれば、
2進数で、00000000~11111111の範囲の数、すなわち、
10進数で、0~255、の範囲の数を使って計算出来るって寸法です。
これなら、結構マトモな計算が出来そうですね。

既に気づいた人がおられるかもしれませんが、その通りです。
CPUが1回で扱うメモリの2進数での桁数が、ビット数なのです。
CPUが何ビットと言ったような場合には、だいたいそのような意味です。
ただし、特殊命令でそれ以上のビット数を一度で計算できるCPUもあります。

なお、1ビットとは、2進数1桁のことを意味しています。
先ほどの場合、CPUの処理単位が32ビットであるということです。

目次に戻る

32ビットのロッカー


CPUは、メモリのデータの何個かをひとまとめにして取り扱うことは説明しました。
そして、現在のコンピュータは、多くが32個をひとまとめにして取り扱っています。
これを、32ビットコンピュータと呼ぶわけです。
ここから先では、この32ビットを前提として話を進めていくことにします。

32ビットのコンピュータは、32個のデータをひとまとめにして取り扱います。
つまり、超巨大な1列ロッカーは、32個ずつ仕分けして使えばいいのです。
しかし、現実には、8個ずつに仕分けされて、それぞれに番号がつけられています。
8個ずつにデータを区分けするとは、メモリを8ビット単位で取り扱うということです。

8ビットは1バイトとも呼ばれていて、コンピュータの基本的な単位となっています。
これは、色々なデータを扱う上で、8ビットは都合が良いからです。
8ビットで0~255の数値を表せるので、比較的小さな数値の記憶には最適です。
また、2進数で動作するコンピュータには、8ビットはキリのいい桁でもあります。

この様な事情から、実際のコンピュータでのメモリの取り扱いは、
ロッカーを8個ずつにまとめて、8個を1単位として番号を割り当てています。
32ビットコンピュータでは、これに32ビットの範囲内で番号が割り当てられています。
32ビットの範囲内ということは、すなわち、2進数で、
00000000000000000000000000000000 ~ 11111111111111111111111111111111
の範囲内であり、10進数で約42億番までの8ビットの数値を扱うことが出来るのです。

目次に戻る