TIL

Today I Learned. 知ったこと、学んだことを書いていく

メモリとデータ型 - C言語

コンピュータが扱う最小単位は「1バイト」。これはメモリのデータ信号ピンが8本しかついていないため。

しかし、1バイトしかデータを扱えないということではない。アドレス信号ピンがついていて、これでアドレスを指定し、データの読み書きを行う。

f:id:tmg1998:20180203094135p:plain:w400

複数バイト使うデータを扱いたい場合には、複数バイト読み書きしないといけない。データ型を指定してプログラミングする。

データ型によって、使用するバイト数は決まっているため、コンピュータはデータ型で判断して読み書きするバイト数を決めている。

データ型 使用するバイト数
char 1
short 2
int 4

以下、データ型によって、書き込んでいるアドレスの間隔が変化することを確認してみた

#include <stdio.h>

/* データ型で使用するサイズ */
int main(void){
    char c[] = {'a', 'b', 'c'}; // サイズ:1バイト
    short s[] = {1, 2, 3};      // サイズ:2バイト
    int a[] = {1, 2, 3};        // サイズ:4バイト

    // char型の配列の要素のアドレス
    printf("char型の配列の要素\n");
    for (int i = 0; i < sizeof(c); i++) {
        // 各要素は1バイト
        printf(" &c[%d]  - %p\n", i, &c[i]);
    }

    // short型の配列の要素のアドレス
    printf("short型の配列の要素\n");
    for (int i = 0; i < sizeof(c); i++) {
        // 各要素は2バイト
        printf(" &s[%d]  - %p\n", i, &s[i]);
    }

    // int型の配列の要素のアドレス
    printf("int型の配列の要素\n");
    for (int i = 0; i < sizeof(c); i++) {
        // 各要素は4バイト
        printf(" &a[%d]  - %p\n", i, &a[i]);
    }
}

実行結果

char型の配列の要素
 &c[0]  - 0x7ffee9d0f9a5
 &c[1]  - 0x7ffee9d0f9a6
 &c[2]  - 0x7ffee9d0f9a7
short型の配列の要素
 &s[0]  - 0x7ffee9d0f99e
 &s[1]  - 0x7ffee9d0f9a0
 &s[2]  - 0x7ffee9d0f9a2
int型の配列の要素
 &a[0]  - 0x7ffee9d0f9ac
 &a[1]  - 0x7ffee9d0f9b0
 &a[2]  - 0x7ffee9d0f9b4

データ型によって使用するバイト数が違うことがわかった

各要素の間隔がデータ型によって、変わっている。char型は1バイト。short型は2バイト。int型は4バイト。

ポインタとデータ型

ポインタとデータ型の関係も面白いと思った

OSによって、メモリ・アドレスが決まっている?64ビットのOSの場合、8バイト?

(あれ、でも、7ffee9d0f9a5は6バイト(48ビット)だよ...なにこれ...今回は6バイトで話を進めていこう)

表現できるアドレスが6バイトであるため、ポインタに格納できる最大バイト数は6バイトということになる

しかし、ポインタは何か1つのデータ型に紐付けて定義する。アドレスの場所から何バイト分読み書きするかを決めるのがデータ型となっている

以下のコードはポインタを宣言している

char *cp;
short *sp;
int *ip;

アドレスは6バイトって決まっているのに、charとかshortとかintにポインタをくっつけてる!?

charのポインタは*cpに格納されているアドレス(6バイト)から1バイト分だけデータを読み書きするということになる!!

それぞれ、アドレスが0000だった場合、以下のようになる

f:id:tmg1998:20180203093006p:plain:w330

読み書きするバイト数に違いがあるっていうこと!

参考文献

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識