Solaris 7 64 ビット 開発ガイド

int と ポインタが同じサイズであると仮定しない

int とポインタは、ILP32 環境では同じサイズであるため、多くのコードがこの仮定に基づいています。ポインタは、アドレス計算の際に int または unsigned int にキャストされることがあります。また、ポインタは long にキャストすることもできます。long とポインタは、ILP32 および LP64 とで同じサイズだからです。unsigned long を明示的に使うかわりに、uintptr_t を使用してください。uintptr_t は、意図することがより明確にわかり、コードをより移植可能なものにして、その結果将来変更があっても影響されないようにするためです。


例 4-3

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

%
warning: conversion of pointer loses bits

推奨される使用法

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