64位Windows上的长位是多少?

时间:2008-12-21 14:10:43

标签: c++ c windows 64-bit porting

不久前,有人告诉我{64}机器上long不是64位,我应该总是使用int。这对我来说没有意义。我看过docs(例如Apple官方网站上的文档)说编译64位CPU时long确实是64位。我查看了64位Windows上的内容并找到了

  
      
  • Windows:longint的长度保持为32位,以及特殊的新数据类型   是为64位整数定义的。
  •   

(来自http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2

我应该使用什么?如果不在Windows上,我应该将uwsw((un)签名宽度)定义为long,否则检查目标CPU位大小?

7 个答案:

答案 0 :(得分:237)

在Unix世界中,对于64位平台的整数和指针大小有一些可能的安排。最广泛使用的两个是ILP64(实际上,只有极少数例子; Cray就是其中之一)和LP64(几乎所有其他的)。 acronynms来自'int,long,指针是64位'和'long,指针是64位'。

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(即几乎所有后来的用户都使用LP64,基于Aspen组的建议;只有具有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类型 - 用于保存指针的有符号整数类型;你应该计划不使用它,或者仅仅因为减去两个uintptr_t值(ptrdiff_t)而使用它。

但是,正如问题所指出的那样(难以置信),64位机器上的整数数据类型的大小有不同的系统。习惯它;世界不会改变。

答案 1 :(得分:45)

目前尚不清楚问题是关于Microsoft C ++编译器还是Windows API。但是,没有[c ++]标签,所以我认为它是关于Windows API的。一些答案遭受链接腐烂,所以我提供了另一个可以腐烂的链接。


有关Windows API类型的信息,例如INTLONG等,MSDN上有一个页面:

Windows Data Types

此信息也可在各种Windows标头文件中使用,例如WinDef.h。我在这里列出了一些相关的类型:

Type                        | S/U | x86    | x64
----------------------------+-----+--------+-------
BYTE, BOOLEAN               | U   | 8 bit  | 8 bit
----------------------------+-----+--------+-------
SHORT                       | S   | 16 bit | 16 bit
USHORT, WORD                | U   | 16 bit | 16 bit
----------------------------+-----+--------+-------
INT, LONG                   | S   | 32 bit | 32 bit
UINT, ULONG, DWORD          | U   | 32 bit | 32 bit
----------------------------+-----+--------+-------
INT_PTR, LONG_PTR, LPARAM   | S   | 32 bit | 64 bit
UINT_PTR, ULONG_PTR, WPARAM | U   | 32 bit | 64 bit
----------------------------+-----+--------+-------
LONGLONG                    | S   | 64 bit | 64 bit
ULONGLONG, QWORD            | U   | 64 bit | 64 bit

“S / U”列表示签名/未签名。

答案 2 :(得分:4)

MSDN上的这篇文章引用了许多类型别名(在Windows上可用),它们的宽度更加明确:

http://msdn.microsoft.com/en-us/library/aa505945.aspx

例如,虽然您可以使用ULONGLONG来引用64位无符号整数值,但您也可以使用UINT64。 (对于ULONG和UINT32也是如此。)也许这些会更清楚一些?

答案 3 :(得分:3)

Microsoft还为与指针大小相同的整数定义了UINT_PTR和INT_PTR。

这是一个list of Microsoft specific types - 它是他们的驱动程序参考的一部分,但我相信它也适用于一般编程。

答案 4 :(得分:2)

了解编译器/平台的最简单方法:

#include <iostream>

int main() {
  std::cout << sizeof(long)*8 << std::endl;
}

乘以8是从字节中获取位。

当您需要特定大小时,通常最容易使用某种预定义类型的库。如果这是不合需要的,您可以执行autoconf软件经常发生的事情,并让配置系统确定所需大小的正确类型。

答案 5 :(得分:0)

如果您需要使用一定长度的整数,您可能应该使用一些独立于平台的标题来帮助您。 Boost是一个值得关注的好地方。

答案 6 :(得分:0)

在Windows平台上,long的大小为32位(4字节)。

您可以使用sizeof(long)进行检查。