不久前,有人告诉我long
在 64 位机器上不是 64 位,我应该始终使用int
。这对我来说没有意义。我看过文档(例如苹果官方网站上的文档)说long
为 64 位 CPU 编译时确实是 64 位。我查了一下 64 位 Windows 上的内容,发现
- 视窗:
long
and int
长度保持 32 位,以及特殊的新数据类型
是为 64 位整数定义的。
(from http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2)
我应该用什么?我应该定义类似的东西uw
, sw
((无)符号宽度)作为long
如果不是在 Windows 上,否则检查目标 CPU 的大小?
在 Unix 世界中,64 位平台的整数和指针的大小有几种可能的安排。最广泛使用的两个是 ILP64(实际上,这只是极少数的例子;Cray 就是其中之一)和 LP64(几乎适用于其他所有内容)。这些缩写词来自“int、long、pointers are 64-bit”和“long、pointers are 64-bit”。
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
type - 用于保存指针的有符号整数类型;你应该计划不使用它,或者只使用它作为两个相减的结果uintptr_t
值(ptrdiff_t
).
但是,正如问题所指出的(难以置信),64 位机器上的整数数据类型的大小有不同的系统。习惯它;世界不会改变。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)