不久前,有人告诉我 long
在 64 位机器上不是 64 位,我应该始终使用 int
。这对我来说没有意义。我看过文档(例如 Apple 官方网站上的文档)说在为 64 位 CPU 编译时,long
确实是 64 位。我在 64 位 Windows 上查找了它,发现
- Windows:
long
andint
remain 32-bit in length, and special new data types are defined for 64-bit integers.
(来自 http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2)
我应该使用什么?如果不在 Windows 上,我是否应该将 uw
、sw
((un)signed width) 定义为 long
,否则请检查 objective-c PU 位大小?
最佳答案
在 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>
header ,当平台上的类型可用时,提供有符号(列出)和无符号(未列出;前缀为'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 位机器上整数数据类型的大小有不同的系统。习惯它;世界不会改变。
关于c++ - 在 64 位 Windows 上 long 的位大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384502/