Sun Studio 12:C 用户指南

7.3.1 整型和指针长度更改

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