c++ - 在 64 位 Windows 上 long 的位大小是多少?

标签 c++ c windows 64-bit porting

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

  • Windows: long and int remain 32-bit in length, and special new data types are defined for 64-bit integers.

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

我应该使用什么?如果不在 Windows 上,我是否应该将 uwsw ((un)signed width) 定义为 long,否则请检查 objective-c PU 位大小?

最佳答案

在 Unix 世界中,对于 64 位平台,整数和指针的大小有几种可能的安排。最广泛使用的两个是 ILP64(实际上,只有极少数的例子;Cray 就是这样一个例子)和 LP64(几乎所有其他的例子)。缩写词来自“int, long, pointers are 64-bit”和“long, pointers are 64-bit”。

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 所取代(也就是说,根据 Aspen 小组的建议,几乎所有后来的进入者都使用 LP64;只有具有 64 位操作传统的系统才使用不同的方案)。所有现代 64 位 Unix 系统都使用 LP64。 MacOS X 和 Linux 都是现代 64 位系统。

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

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

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

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

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

关于c++ - 在 64 位 Windows 上 long 的位大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384502/

相关文章:

c++ - 链接上 undefined symbol ___gxx_personality_v0

c++ - 从 R - .C vs .Call 调用 CUDA 编译的 .dll

当应用程序使用 poll() 而不是 linux 中的 epoll() 时,调用被路由到驱动程序

c++ - 支持 Windows 的 p2p c++​​ 库?

javascript - Windows 8 HTML5 - 调整拆分应用程序的布局?

c++ - 无法在模板参数中进行函数调用

c++ - Eigen 3.3.4 : What is the way to create Map<VectorXd> to 2d Block?

c++ - 有什么办法可以在 C++ 中使可变长度数组成为全局数组吗?

c - 如何安全地将数据从 C 传输到 Perl?

windows - 如何使用 Azure Cli 在 Azure Windows VM 上安装 IIS