64位Windows上Long的位大小是多少?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (1361)

不久前,有人告诉我,long在64位机器上不是64位,我应该一直使用int。这对我没有意义。我看过文档(比如苹果官方网站上的文档)说,long编译64位CPU时确实是64位。我查了一下它在64位Windows上的发现

  • Windows:longint保持32位长度,并为64位整数定义特殊的新数据类型。
提问于
用户回答回答于

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

Windows数据类型

该信息也可用于各种Windows头文件中WinDef.h。我在这里列出了一些相关的类型:

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

列“S / U”表示有符号/无符号。

用户回答回答于

在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。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位机器上整数数据类型的大小有不同的系统。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励