Solaris(64 位)开发者指南

请勿假设 int 和指针的长度相同

由于类型为 int 的数据和指针在 ILP32 环境中长度相同,因此许多代码会依赖于这一假设。通常会将指针强制转换为 intunsigned 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);