在 Unix 世界中,对于 64 位平台的整数和指针的大小有几种可能的安排。最广泛使用的两个是 ILP64(实际上,只有极少数的例子;Cray 就是这样一个例子)和 LP64(几乎所有其他的例子)。首字母缩写词来自“int,long,指针是 64 位”和“long,指针是 64 位”。
Type ILP64 LP64 LLP64
char 8 8 8
short 16 16 16
int 64 32 32
long 64 64 32
long long 64 64 64
pointer 64 64 64
ILP64 系统被放弃,取而代之的是LP64(也就是说,根据 Aspen 小组的建议,几乎所有后来的进入者都使用 LP64;只有具有 64 位操作传统的系统才使用不同的方案)。所有现代 64 位 Unix 系统都使用 LP64。MacOS X 和 Linux 都是现代 64 位系统。
Microsoft 使用不同的方案转换到 64 位:LLP64('long long,指针是 64 位')。这意味着 32 位软件可以在不改变的情况下重新编译。它的缺点是与其他人所做的不同,并且还需要修改代码以利用 64 位容量。总是需要修改;它只是一组与 Unix 平台所需的不同的修订。
如果您围绕平台中立的整数类型名称设计软件,可能使用 C99<inttypes.h>
标头,当平台上可用类型时,该标头提供有符号(列出)和无符号(未列出;前缀为 'u'):
int8_t
- 8 位整数
int16_t
- 16 位整数
int32_t
- 32 位整数
int64_t
- 64 位整数
uintptr_t
- 大到足以容纳指针的无符号整数
intmax_t
- 平台上最大的整数大小(可能大于int64_t
)
然后,您可以在重要的地方使用这些类型对您的应用程序进行编码,并对系统类型(可能不同)非常小心。有一种intptr_t
类型——一个有符号整数类型,用于保存指针;您应该计划不使用它,或者仅将其用作两个uintptr_t
值相减的结果 ( ptrdiff_t
)。
但是,正如问题所指出的那样(难以置信),64 位机器上整数数据类型的大小有不同的系统。习惯它; 世界不会改变。