【发布时间】:2010-09-27 22:09:28
【问题描述】:
不久前,有人告诉我long 在 64 位机器上不是 64 位,我应该始终使用 int。这对我来说没有意义。我看过文档(例如 Apple 官方网站上的文档)说 long 在为 64 位 CPU 编译时确实是 64 位。我在 64 位 Windows 上查找了它,发现
- Windows:
long和int保持 32 位长度,以及特殊的新数据类型 为 64 位整数定义。
(来自http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2)
我应该使用什么?如果不在 Windows 上,我是否应该将 uw、sw ((un)signed width) 定义为 long,否则检查目标 CPU 位大小?
【问题讨论】:
-
在带有 MSVC++ int 和 long 的 Windows 上是 32 位:msdn.microsoft.com/en-us/library/3b2e7499.aspx。但是,允许例如用于存储超过 4G 项的向量,size_t 为 64 位。因此,需要使用 int64_t 而不是 int 进行迭代,例如可能包含超过 4G 项的向量。
-
在 Cygwin
sizeof(long) == 8, even on Windows :-) -
@LưuVĩnhPhúc,
size_t在负数附近变得棘手,因为size_t是无符号的。所以for(size_t i=0; i<v.size()-2; i++)对向量大小 0 和 1 失败。另一个例子:for(size_t i=v.size()-1; i>=0; i--)。 -
如果您正在对指针进行数学运算(即使用
size_t值,那么结果应保存在ptrdiff_t类型的变量中 - 该变量设计得足够大以容纳这样的结果并且正是出于这个原因,它是一个 signed 类型!) -
@OrionEdwards 实际上是关于目标平台 ABI。 Cygwin 拥有自己的类似 POSIX 的 ABI,并选择了对 POSIX 更友好的 LLP64 模型,而 Mingw 坚持使用其 LP64 模型的 Win32 ABI。出于这个原因,在与 Mingw 捆绑在一起的 GCC 中
long是 32 位,而在 Cygwin 中的 GCC 中是 64 位。
标签: c++ c windows 64-bit porting