由于整型和指针在 ILP32 编译环境中长度相同,因此某些代码依赖以下假定。通常会将指针强制转换为 int 或 unsigned int 以进行地址运算。但是,由于 long 和指针在 ILP32 和 LP64 数据类型模型中长度相同,因此可以将指针强制转换为 long。请改用 uintptr_t,而不是显式使用 unsigned long。这样可以更详细地表达您的意图,并且使代码更易于移植,避免受到未来更改的影响。请看以下示例:
char *p; p = (char *) ((int)p & PAGEOFFSET); % warning: conversion of pointer loses bits
修改后的版本为:
char *p; p = (char *) ((uintptr_t)p & PAGEOFFSET);