不久前,有人告诉我long
在64位机器上不是64位,我应该一直使用int
。这对我来说没有意义。我看到文档(如苹果官方网站上的文档)说long
在64位CPU上编译时确实是64位。我查了一下64位Windows上的内容,发现
- Windows:
long
和int
的长度保持为32位,并且为64位整数定义了特殊的新数据类型。
(from http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2)
我应该使用什么?如果不是在Windows上,我应该定义uw
,sw
((无)符号宽度)作为long
,否则检查目标CPU位大小?
8条答案
按热度按时间zujrkrfu1#
如果你需要使用一定长度的整数,你可能需要使用一些平台独立的头来帮助你,Boost是一个很好的地方。
6bc51xsx2#
在Unix世界里,64位平台上整数和指针的大小有几种可能的安排,其中最广泛使用的两种是ILP 64(实际上,这方面的例子很少; Cray就是这样的一个)和LP 64(几乎所有其他的)。缩写词来自“int,long,pointers are 64 bit”和“long,pointers are 64 bit”。
ILP 64系统被LP64系统所取代(也就是说,基于白杨小组的建议,几乎所有后来加入者都使用LP 64;只有长期继承64位操作的系统才使用不同的方案)。所有现代64位Unix系统都使用LP 64。MacOS X和Linux都是现代64位系统。
Microsoft使用不同的方案过渡到64位:LLP 64(“long long,pointers are 64-bit”)。它的优点是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位机器上,整数数据类型的大小有不同的系统。世界不会改变。
mo49yndu3#
目前还不清楚这个问题是关于微软C++编译器还是Windows API。但是,没有[c++]标记,所以我假设它是关于Windows API的。有些答案已经遭受了链接腐烂,所以我提供了另一个链接,可以腐烂。
有关
INT
、LONG
等Windows API类型的信息,MSDN上有一个页面:Windows Data Types
这些信息也可以在各种Windows头文件中找到,比如
WinDef.h
。我在这里列出了一些相关的类型:“S/U”列表示有符号/无符号。
ggazkfy84#
MSDN上的这篇文章引用了许多类型别名(在Windows上可用),它们的宽度更显式一些:
http://msdn.microsoft.com/en-us/library/aa505945.aspx
例如,虽然可以使用ULONGLONG来引用64位无符号整数值,但也可以使用UINT64。(ULONG和UINT32也是如此。)也许这样会更清楚一些?
ddrv8njm5#
Microsoft还为与指针大小相同的整数定义了UINT_PTR和INT_PTR。
这里有一个list of Microsoft specific types-它是他们的驱动程序参考的一部分,但我相信它对一般编程也是有效的。
ezykj2lf6#
了解您的编译器/平台的最简单方法:
乘以8是从字节中获取位。
当你需要一个特定的大小时,使用一个预定义的库类型通常是最简单的,如果你不想这样做,你可以用autoconf软件做一些经常发生的事情,让配置系统为所需的大小确定正确的类型。
h7appiyu7#
Windows平台上
long
的大小为32位(4字节)。您可以使用
sizeof(long)
检查这一点,它返回以字节为单位的大小。vzgqcmou8#
对于UNIX和Windows的选择历史(不同的选择是合理的,考虑到它的代码库,微软并不是愚蠢的):通往64位的漫漫长路-双双,辛劳和麻烦,在https://queue.acm.org/detail.cfm?id=1165766 2006队列或https://dl.acm.org/doi/pdf/10.1145/1435417.1435431 2009 CACM中
注:我帮助设计了64/32位MIPS R4000,提出了导致C99的建议,<inttypes.h>并编写了解释长期动机的C99部分。