Oracle® Solaris Studio 12.4: C ユーザーガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

7.3.1 整数とポインタのサイズの変更

ILP32 コンパイル環境では整数とポインタは同じサイズであるため、一部のコードはこの前提に依存しています。アドレス演算では、ポインタはしばしば int または unsigned int に型変換されます。ILP32 と LP64 データ型モデルで、long とポインタが同じサイズであるため、代わりにポインタを long に型変換してください。明示的に unsigned long を使用するのではなく、代わりに uintptr_t を使用してください。意図がより正確に表現され、コードの移植性が向上し、将来の変更に容易に対応できます。次の例を考えてみましょう。

char *p;
p = (char *) ((int)p & PAGEOFFSET);
%
warning: conversion of pointer loses bits

変更後のバージョン:

char *p;
p = (char *) ((uintptr_t)p & PAGEOFFSET);