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);