64位Windows上的长位是多少?

134 c c++ windows 64-bit porting

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

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

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

我该怎么用?我应该定义类似uw,sw((UN)签署的宽度)为long如果没有在Windows,否则做对目标CPU bitsize支票?

Jon*_*ler 254

在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
Run Code Online (Sandbox Code Playgroud)

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位机器上的整数数据类型的大小有不同的系统.习惯它; 世界不会改变.

  • @TomFobear:ILP64提出了一个主要问题 - 你称之为32位类型?或者,如果你调用32位类型`short`,你怎么称呼16位类型?如果你为UTF-16等调用16位类型`char`,你称之为8位类型?因此,使用LP64会留下8位`char`,16位`short`,32位`int`,64位`long`,有向上扩展到128位`long long`的空间时(如果?)变得相关.在那之后,你有比256中的名字更多的权力256(好吧,我想你可以有一个256位的`intmax_t`,然后才会用完).LP64有其优点. (16认同)
  • 对于那些使用时间足够长的人来说,64位转换与80年代中期的16位到32位转换有一些相似之处.有些计算机是IL32,其他计算机是L32(将新表示法改为旧问题).有时'int'是16位,有时是32位. (11认同)
  • 不要忘记这只适用于C-ish语言.其他人有更合理的规范,其中a)编译器编写者不允许选择数据类型的大小或b)数据类型的物理表示不"泄漏"或c)整数总是无限大. (3认同)
  • 如果您今天要重新发明 C,即使有 20:20 的后见之明和 45 年的 C 经验,也不清楚您是否会做出这种改变。有许多不同的 CPU 类型,8 位或 16 位 CPU 的明智设计决策在 64 位 CPU 上不一定是明智的。我相信仍然有一些系统的字长不是 2 的幂,例如;C 发明时还有更多。该标准是编译器实现者和使用编译器的程序员之间的条约。如果您仔细遵循规则,您就可以编写可移植的代码。 (3认同)
  • @deltamind:事后看来很容易说,但 C 最初必须在具有 18 位和 15 位整数以及 7 位字符的机器上运行,幸运的是,这些不再流行。 (3认同)
  • 是的-但是对于那些指定行为的语言,首先没有问题。例如,Java在所有平台上都有一个“长”号,但大小是固定的(64位?)。因此,移植到64位计算机没有任何问题。大小不变。 (2认同)
  • 也许这对你们来说很明显,但我认为值得注意的是C#使用不同于其他所有的整数大小.我最近因为C#使用64位长(http://msdn.microsoft.com/en-us/library/ms173105.aspx)而与DLL连接起来. (2认同)

Mar*_*age 52

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


有关Windows API类型等的信息INT,LONGMSDN上有一个页面:

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"列表示签名/未签名.


reu*_*ben 5

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

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

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


Mar*_*som 5

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

这是Microsoft 特定类型的列表- 它是其驱动程序参考的一部分,但我相信它对于一般编程也有效。


Pol*_*ker -3

如果您需要使用特定长度的整数,您可能应该使用一些与平台无关的标头来帮助您。Boost 是一个值得一看的好地方。