データ型モデルと CRuby の型
(改訂 2010.08.20) 参考文献を追加し、その内容に合わせて修正。
僕は、様々なアーキテクチャで動かせるコードを書こうとしているとき、long と void* のサイズの関係などが分からなくなって手を止める事が結構あります。後学のために一度整理しておこうと思い、表にまとめてみました。
モデル名 | sizeof(int) | sizeof(long) | sizeof(long long) | sizeof(void*) | 主なアーキテクチャ |
---|---|---|---|---|---|
LP32 | 2 | 4 | - | 4 | ほぼ皆無 Win3.1など (16ビット環境) |
ILP32 | 4 | 4 | 8 | 4 | ほとんどの32ビット環境 |
LLP64 | 4 | 4 | 8 | 8 | Win64 |
LP64 | 4 | 8 | 8 | 8 | 64ビットのLinux |
ILP64 | 8 | 8 | 8 | 8 | ほぼ皆無 SGI |
NOTE: sizeof(char) == 1 と sizeof(short) == 2 はすべてで共通なので表から消しました。
CRuby が処理系の実装で使っているデータ型のうち、VALUE, BDIGIT, BDIGIT_DBL は上記の型のサイズに依存して決まります。LONG_LONG 型は C99 の long long 型と同じものと考えてください (移植性を高めるために別名を使っています)。
モデル名 | VALUE | BDIGIT | BDIGIT_DBL |
---|---|---|---|
LP32 | unsigned long | unsigned int | unsigned long |
ILP32 | unsigned long | unsigned int | unsigned LONG_LONG |
LLP64 | unsigned LONG_LONG | unsigned int | unsigned LONG_LONG |
LP64 | unsigned long | unsigned int | unsigned LONG_LONG |
ILP64 | unsigned long | unsigned short | unsigned long |