Solaris 64 ビット 開発ガイド

データ型モデル

すでに説明したように、32 ビットと 64 ビットの環境の大きな違いは、データ型モデルです。

32 ビットアプリケーションに使用される C データ型モデルは ILP32 で、intlong、およびポインタが 32 ビットであるためそのように呼ばれています。LP64 データ型モデルは、64 ビットアプリケーション用の C データ型モデルで、long とポインタが 64 ビットに拡大されたためそのように呼ばれています。またこの LP64 データ型モデルは、業界の企業コンソーシアムで合意を得ています。C のデータ型の intshortchar は、ILP32 データ型モデルと同じです。

次に示すように C の各整数データ型間の標準的な関係は変わりません。


sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long)

表 4-1 に C の基本データ型と、それらの ILP32 および LP64 のデータ型モデルでのサイズをビット単位で示します。

表 4-1 データ型サイズ (単位 : ビット)

C データ型 

ILP32 

LP64 

char

変更なし 

short

16 

変更なし 

int

32 

変更なし 

long

32 

64

long long

64 

変更なし 

ポインタ

32 

64

enum

32 

変更なし 

float

32 

変更なし 

double

64 

変更なし 

long double

128 

変更なし 

32 ビットアプリケーションにおいては、しばしば int、ポインタ、および long が同じサイズであると仮定します。LP64 データ型モデルでは、long とポインタのサイズが変更されています。この点から、32 ビットから 64 への変換の問題が発生する可能性があるということを認識する必要があります。

さらに意図するプログラム処理を示すためには、宣言とキャストが重要になります。たとえば、データ型が変わると式の評価方法が影響を受ける可能性があります。データ型のサイズが変更された場合には、C の標準の変換規則は影響を受けます。意図する内容を明確に示すには、定数の型を宣言する必要があります。キャストを式に入れることによって、式を確実に意図するように評価させることも必要です。これは特に、符号拡張の場合に当てはまります。この場合、目的の処理を正しく示すには、明示的にキャストする必要があります。

その他の問題としては、組み込みの C 演算子、書式文字列、アセンブリ言語、互換性、および相互運用性の問題があります。

この章の以降の節で、これらの問題の対処方法を紹介します。