C/C++ ポインター入門 > メモリ
Nobuhide Tsuda
Oct-2013
メモリ
- PC の中にはメモリというものが入っているぞ。
- メモリはデータを蓄えておくところだ。
- 電源を切ってもデータが消えないHDDに比べ、電源を切るとデータが消えてしまうぞ。
- そのかわり、データの読み書きが HDD よりもかなり高速だぞ。
- メモリは下図のようになってるぞ
- ひとつの箱がデータを入れるところ。そこには1バイトのデータを入れることが出来るぞ
- 1バイトとは8ビットのことだ。10進数で言えば 0~255、16進数で言えば 0x00 ~ 0xff までのデータを格納できるぞ。
忘れている人は2進数・16進数を参照してね
- それぞれの箱には0から始まる番号がついていて、それをキーにしてデータにアクセスするんだぞ。
- その番号のことを「アドレス」または「番地」って呼ぶんだぞ。
- 最近のPCだと箱の数は 2^32 = 約41億、または 2^64 = 1.8*10^19 というトンデモない数だぞ。
- ひとつの箱には1バイトのデータしか入れることが出来ない。
- C/C++ の int のサイズは4バイトなので、それをメモリに入れると4つの箱を使うぞ
- データを箱に入れる順番は、下位バイトから入れていくのと、上位バイトから入れていくのの2種類があるぞ。
- 前者を「リトル・エンディアン」、後者を「ビッグ・エンディアン」と呼ぶぞ。
- どちらなのかは CPU の種類で決まっている。
- 普通のPCのCPUは「リトル・エンディアン」だぞ。
- あなたの環境が「リトル・エンディアン」なのか「ビッグ・エンディアン」なのかを判定するには、
下記のプログラムをビルド・実行するといいぞ
#include <iostream>
#include <iomanip>
#define hexformat(fill,wd) std::hex<<std::setfill(fill)<<std::setw(wd)
int main()
{
const int SIZE = sizeof(int);
unsigned char v[SIZE]; // int の値を入れるための配列
int x = 0x12345678;
*(int *)&v[0] = x; // 配列 v に無理やり x の値を格納
for(int i = 0; i < SIZE; ++i) {
std::cout << "v[" << i << "] = 0x"
<< hexformat('0', 2) << (int)v[i] << "\n";
}
}
実行結果:
v[0] = 0x78
v[1] = 0x56
v[2] = 0x34
v[3] = 0x12
上記のように、下位バイトから順にメモリに格納されていれば「リトル・エンディアン」だぞ
前:2進数、16進数
|上:C/C++ ポインタ入門
|次:ポインタの宣言・初期化