由于类型为 int
的数据和指针在 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);