在64位 Windows 上,长的位大小是多少?

不久前,有人告诉我,在64位的机器上,long不是64位,我应该一直使用 int。这对我来说毫无意义。我看过一些文档(比如苹果官方网站上的文档)说,在为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((未)有符号宽度)的值定义为 long,或者检查目标 CPU 位大小?

220127 次浏览

如果您需要使用一定长度的整数,那么您可能应该使用一些独立于平台的 Header 来帮助您。Boost 是一个很好的观察点。

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

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

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

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

#include <iostream>


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

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

当您需要特定的大小时,通常最容易使用库的预定义类型之一。如果不希望这样,您可以使用 autoconf 软件执行经常发生的操作,并让配置系统为所需的大小确定正确的类型。

Microsoft 还为与指针大小相同的整数定义了 UINT _ PTR 和 INT _ PTR。

这里是一个 Microsoft 特定类型的列表-这是他们的驱动程序参考的一部分,但我相信它是有效的一般编程以及。

在 Unix 世界中,对于64位平台的整数和指针的大小有一些可能的安排。两个最广泛使用的是 ILP64(实际上,只有很少的几个例子; Cray 就是其中之一)和 LP64(用于几乎所有其他东西)。首字母缩略词来自“ 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。MacOSX 和 Linux 都是现代的64位系统。

Microsoft 使用不同的方案转换到64位: LLP64(“长长的,指针是64位的”)。这就意味着32位软件可以在不改变的情况下重新编译。它的缺点是不同于其他人所做的,并且还需要修改代码以利用64位的能力。总是有必要的修改; 它只是一组不同于 Unix 平台上需要的修改。

如果你的软件是围绕平台中立的整数类型名称设计的,可能使用 C99 <inttypes.h>头文件,当这些类型在平台上可用时,提供有符号(列出)和无符号(未列出; 前缀为‘ u’) :

  • int8_t-8位整数
  • int16_t-16位整数
  • int32_t-32位整数
  • int64_t-64位整数
  • uintptr_t-大到足以容纳指针的无符号整数
  • 平台上最大的整数大小(可能大于 int64_t)

然后,您可以在需要的地方使用这些类型来编写应用程序,并对系统类型非常小心(可能会有所不同)。有一个 intptr_t类型——用于保存指针的有符号整数类型; 您应该计划不使用它,或者只使用它作为减去两个 uintptr_t值(ptrdiff_t)的结果。

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

不清楚问题是关于 Microsoft C + + 编译器还是 Windows API。但是,没有[ c + + ]标记,所以我假设它是关于 WindowsAPI 的。一些答案已经遭受链接腐烂,所以我提供了另一个链接,可以腐烂。


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

Windows 数据类型

这些信息也可以在各种 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”列表示有符号/无符号。

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

您可以使用以字节为单位返回大小的 sizeof(long)来检查这一点。