ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
データ型の大きさなどを定義するもの。
処理系が用いるデータ型の大きさなどを定義するものであり、特にプログラミング環境で重要となる。
現在使われているプログラミング言語には、整数型の実際の大きさを保証しないものがあり、データ型モデルに応じて変化する。
ある特定のデータ型モデルに依存したプログラムも簡単に書くことができるが、そのようなものは移植性が無いということである。
大まかに、64ビット用には次の三種類のデータモデルが存在する。
32 | char | short | int | long | long long | void * | 実装例 |
---|---|---|---|---|---|---|---|
ILP32 | 8 | 16 | 32 | 32 | 64 | 32 | 多くの32ビット環境 |
LP32 | 8 | 16 | 16 | 32 | 64 | 32 | 実装例は少ない |
64 | char | short | int | long | long long | void * | 実装例 |
LLP64 | 8 | 16 | 32 | 32 | 64 | 64 | Win64 |
LP64 | 8 | 16 | 32 | 64 | 64 | 64 | 多くの64ビットLinux |
ILP64 | 8 | 16 | 64 | 64 | 64 | 64 | 実装例は少ない |
処理系によっては複数のデータモデルに対応し、コンパイラーのオプションで切り替えられるものもある。
x64に対応したLinux用GCCでは、-m32オプションでILP32、-m64オプションでLP64が選択される。但し-m32では、出力されるバイナリはIA-32用のものである。
一般的な32ビット環境で、int、long、ポインターが32ビットである。
後に、ソフトウェア的な処理で64ビット長のlong longを提供する処理系も一般化した。
64ビット実装モデルの一つ目。ポインターのみを64ビット化したもの。
Microsoft Windowsの64ビット版(Win64)で採用された。
ポインター以外の各整数型はILP32と同じため、ソースの互換性が高く64ビット化において最も問題が少ないと考えられているモデルである。
但し、long型にポインターを代入するような不適切な処理をしているプログラムは、プログラムを書き換えないと移植できない。
次のLP64と関連するが、LP64ではunsigned int(32ビット)同士の乗算の結果をunsigned long(64ビット)に格納することが可能だがLLP64ではunsigned longが32ビットのため出来ない。相互の移植性が必要な場合は、処理の方法等を含めた検討が必要である。
64ビット実装モデルの三つ目。ポインターとint以上の変数を64ビット化したもの。
実装例は少なく、殆ど知られていない。
LP64と比較し、longだけでなくintも64ビット化されている。
intとlongのデータ長が同じため、このような実装を想定した32ビット用プログラムの移植性が良いと見込まれる。またポインターをintやlongに代入するような不適切な処理をしているプログラムでも、データ長が同じため問題が顕著化せず、そのまま移植できる。
逆に、intが32ビットであることを想定したプログラムは書き換えが必要となる。とは言え、32ビット長の普通の変数が無い(shortは16ビットなので、int32_tやuint32_tを使わねばならない)という問題もあり、案外と使いにくいモデルでもある。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます