由于整型和指针在 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); |