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