2009年9月23日水曜日

Linux 32ビット版と64ビット版の違い -- データサイズ

64ビット版のLinuxに移行しても、普通に使っている範囲では32ビット版との違いを意識する事はまずない。
しかし内部ではちゃんと変化がある。

末尾に付けたtest.cというファイルは、
$ gcc test.c
でコンパイルできる。そして実行すると
int = 4
int* = 8
void* = 8
long int = 8
long long = 8
short int = 2
float = 4
double = 8
char = 1
wcahr_t = 4
となる。

これが32ビット版のLinux上では
int = 4
int* = 4
void* = 4
long int = 4
long long = 8
short int = 2
float = 4
double = 8
char = 1
wcahr_t = 4
となるはずだ。

long longが4->8バイトになっている以外に、ポインタが64ビットになっている事が分かる。64ビットアドレッシングになっているからだ。
ちなみに、amd64(64ビット版)の上でも32ビット版としてコンパイルすることはできる。
$ gcc -m32 test.c
とすれば良い。
ただしシステム全体は64ビットで、ライブラリ等ももちろん64ビット版としてコンパイルされているので、-m32でコンパイルするにはlib32で始まる32ビット用パッケージをインストールする必要がある。
$ apt-cache search lib32
などとすればそれらしいものが見付かる。


# filename: test.c
#include < stdio.h>
#include < wchar.h>

int main()
{
printf("int = %d\n", sizeof(int));
printf("int* = %d\n", sizeof(int*));
printf("void* = %d\n", sizeof(void*));
printf("long int = %d\n", sizeof(long int));
printf("long long = %d\n", sizeof(long long));
printf("short int = %d\n", sizeof(short int));
printf("float = %d\n", sizeof(float));
printf("double = %d\n", sizeof(double));
printf("char = %d\n", sizeof(char));
printf("wcahr_t = %d\n", sizeof(wchar_t));
}

0 件のコメント: