Solaris 64 ビット 開発ガイド

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

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


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

この場合、次の警告が出ます。


warning: conversion of pointer loses bits

次のコードを使用すると、正しい結果が出ます。


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