不久前,有人告诉我,64位机器上的long
不是64位的,我应该一直使用int
。这对我来说是没有意义的。我见过一些文档(比如苹果官网上的那个)说,在编译64位long
时,它确实是64位的。我在64位Windows上查了一下,发现
long
和int
的长度保持为32位,并且为64位整数定义了特殊的新数据类型。(来自http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2)
我应该使用什么?如果不是在Windows上,我是否应该定义像uw
,sw
(()无符号宽度)这样的东西作为long
,否则对目标CPU位大小进行检查?
发布于 2008-12-21 17:03:11
在Unix世界中,64位平台的整数和指针的大小有几种可能的安排。使用最广泛的两个是ILP64 (实际上,这方面的例子很少;Cray就是其中之一)和LP64 (几乎所有其他东西都是这样)。这些首字母缩写来自于“int,long,pointers 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。Linux和MacOS都是现代的64位系统。
微软使用了一种不同的方案来过渡到64位: LLP64 (“长长的指针是64位的”)。这样做的好处是,32位软件无需更改即可重新编译。它的缺点是不同于其他任何人所做的事情,并且还需要修改代码以利用64位容量。总是有必要进行修订;它只是与Unix平台上需要的修订集不同而已。
如果您围绕平台中立的整数类型名称设计软件,则可能使用C99 <inttypes.h>
标头,当这些类型在平台上可用时,该标头提供有符号(列出)和无符号(未列出;前缀为'u'):
int8_t
-8位integersint16_t
-16位integersint32_t
-32位integersint64_t
-64位integersuintptr_t
-大到足以容纳pointersintmax_t
的无符号整数-平台上整数的最大值(可能大于int64_t
)然后,您可以在重要的地方使用这些类型编写应用程序,并非常小心地使用系统类型(这可能是不同的)。有一种intptr_t
类型--一种用于保存指针的带符号整数类型;您应该计划不使用它,或者只将它用作两个uintptr_t
值(ptrdiff_t
)的减法结果。
但是,正如问题指出的那样(难以置信),64位机器上整数数据类型的大小有不同的系统。习惯它;这个世界不会改变。
发布于 2008-12-21 14:30:42
这篇关于MSDN的文章引用了许多类型别名(在Windows上可用),它们在宽度方面更加明确:
http://msdn.microsoft.com/en-us/library/aa505945.aspx
例如,虽然可以使用ULONGLONG引用64位无符号整数值,但也可以使用UINT64。(尤龙和UINT32也是如此。)也许这些会更清楚一些?
发布于 2008-12-21 16:01:15
微软还为与指针大小相同的整数定义了UINT_PTR和INT_PTR。
这是一个list of Microsoft specific types -它是他们的驱动程序参考的一部分,但我相信它对于一般编程也是有效的。
https://stackoverflow.com/questions/384502
复制相似问题