今回は、ちょっと余談なのですが、インターネットなどのサンプルプログラムのコメントで、『1キロバイトのメモリを確保…』、なんて、書かれてあるのを見たことありませんか?
'1キロバイトメモリを確保
Dim bufs(1023) as Byte
実際にソースコードをよく見ると、上記のようにByte型で、1024バイト確保しているのですが、これって、1キロバイト丁度ではありませんよね。ここに、疑問を感じた方は、いませんでしょうか。
『1キロバイトって1000バイトのはず。』、そうなんです、数学的には、1キロは、1000丁度なのですが、システム屋さんの世界では、1キロバイトは1024なんです。
これ、答えを先に言っちゃうと、システム屋さんは、2のn乗で、物事を考えるというのが理由です。1024は、2の10乗ですよね。先にも言いましたが、数学的には、矛盾しているのですが、この考え方が、システムの世界では、慣習となっています。
ですので、システムやプログラムに関する情報で、4キロバイトの表記を見たら、4(2の2乗)×1024(2の10乗)バイトだと思った方が良いと思います。
ちなみに、キロやメガなどは、システムに限らず、10のn乗を表す、国際単位系(SI:International System of Units)として定められいて、SI接頭辞と呼ばれています。
表記 | 表記(英字) | 単位 |
---|---|---|
キロ | K | 10の3乗 |
メガ | M | 10の6乗 |
ギガ | M | 10の9乗 |
テラ | T | 10の12乗 |
ペタ | P | 10の15乗 |
第3回のVBAプログラム豆知識で『メモリ空間』を説明しましたが、この中で、Windows上のプログラム(プロセス)は、4ギガバイトのメモリ空間を持っていることに触れましたが、皆さん、覚えていますでしょうか?
この4ギガバイトも、4ギガ丁度ではなく、4294967296(2の32乗)が正解です。メモリ空間は、0~4294967296(&HFFFFFFFF)と、捉えてください。これはOSが、メモリ空間のアドレスを、4バイトのデータ型(符号無し)で管理するため、そのようになっています。
このシステム屋さんの慣習、データのサイズだけではありません。CPUの種別として、32ビットCPU、64ビットCPUなどの表記を、目にしたことはありませんでしょうか。これも、それぞれ2の5乗(32)、2の6乗(64)で、2のn乗となっていますね。昔、ゲーム機で、任天堂64なんてありましたが、これも一緒です。
これは、ハードウェアのデータ入出力の、データバス幅からそのようになっています。
それでは、『データ幅って何?』と疑問を感じると思いますので、キーボードとモニタを使った簡単な例を使って、説明したいと思います。
キーボードとモニタを直接接続した構成で、入力したキーに対応する文字を、モニタで表示する単純な仕組みがあったとします。但し、ここでは、半角文字(片仮名除く)のみに対応した仕様とします。
半角文字のみの表示なので、以下のアスキーコード表によると、&H00~&H7Fまでが表現できれば、良いことになります。従って、ビット数としては、7ビットあれば、表示する文字を判定することができます。
文字を判定するには、7ビットあればよいのですが、もう一つ、モニタ側が、キーが押されたことを知るためのタイミングが必要になります。ですので、このタイミングを検知するための、同期信号として、もう1ビット必要となります。
通常、このモニタのようなハードウェアは、同期信号の立ち上がり、もしくは、立ち下りに同期して、他のビットのデータ(文字種)を読み出します。
ですので、モニタ側で、キーボードにより入力された文字を表示するために、必要なデータの入出力は合計で8ビットということになり、モニタとキーボード間の、信号を送受信するための物理的な配線(Line)も、8本という構成になります。
この8ビットというデータ入出力の幅が、データ幅といわれるものです。
今では、文字コード体系がユニコードが主流になったこと、また、英語圏以外の言語に対応したことにより、文字コードは、複数バイトになっていますが、C言語に、文字を扱うデータ型として、char型という1バイトのデータ型が、存在するのは、このあたりが理由だと思います。
映画『スティーブ・ジョブズ』で、ジョブズとその仲間が、マッキントッシュの原型ともいえる、コンピュータをガレージで、開発していますが、その中で、キーボードとモニタを接続して、文字を表示しているワンシーンがあります。おそらく、今回、説明に使った例と、似たような仕組みだったのでは、ないでしょうか。
『システム屋さんは、2のn乗で物事を考える』なんて、書きましたが、メモリを確保する際に、必ず2のn乗で、確保しなければ、いけないということではありません。数学的に、矛盾している点を、理由も含めて、説明したかったので、今回、この話をテーマにしてみました。
自分の思ったサイズ、数値でコーディングすることで、まったく問題ありませんので… 大切なのは、正しくプログラムが動作することです。
ご意見・ご要望等ありましたら、画面最下部のメールアドレスまでご連絡ください。