什么是在64位Windows上长的位大小?

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

  • Windows: longint保持32位长度,为64位整数定义特殊的新数据types。

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

我应该使用什么? 我应该定义一些像uwsw ((un)signed long )作为一个long如果不是在Windows上,否则检查目标CPU bitsize?

在Unix世界中,针对64位平台的整数和指针的大小有一些可能的安排。 其中最常用的两个是ILP64(实际上,这只是一个很less的例子,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小组的build议;只有具有64位操作的悠久历史的系统使用不同的scheme)。 所有现代的64位Unix系统都使用LP64。 MacOS X和Linux都是现代的64位系统。

Microsoft使用不同的scheme转换到64位:LLP64(“long long,指针是64位”)。 这意味着32位软件可以在不改变的情况下重新编译。 它具有与其他人不同的缺点,还需要对代码进行修改以利用64位容量。 总是需要修改; 这只是在Unix平台上需要的一套不同的修订。

如果围绕与平台无关的整数types名称devise软件,可能使用C99 <inttypes.h>头文件,当平台上的types可用时,头文件将以signed(列出)和unsigned(未列出) 'U'):

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

然后,您可以使用这些types的应用程序对您的应用程序进行编码,并且非常小心系统types(可能不同)。 有一个intptr_ttypes – 用于存放指针的有符号整数types; 你应该计划不使用它,或者只使用它作为减去两个uintptr_t值( ptrdiff_t )的结果。

但是,正如这个问题所指出的,在64位机器上,整数数据types的大小有不同的系统。 习惯它; 世界不会改变。

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


有关Windows APItypes(如INTLONG等)的信息,MSDN上有一个页面:

Windows数据types

这些信息也可以在各种Windows头文件(如WinDef.h 。 我在这里列出了一些相关的types:

types|  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”表示有符号/无符号。

MSDN上的这篇文章引用了一些types别名(在Windows上可用),它们的宽度有点更明确:

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

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

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

这里是微软特定types的列表 – 这是他们的驱动程序参考的一部分,但我相信它也适用于一般编程。

最适合您的编译器/平台的最简单的方法是:

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

乘以8是从字节获得位。

当你需要一个特定的大小时,使用一个库的预定义types通常是最容易的。 如果这是不可取的,您可以使用autoconf软件经常发生的事情,并让configuration系统确定所需大小的正确types。

如果你需要使用一定长度的整数,你可能应该使用一些平台独立的头文件来帮助你。 Boost是一个很好的地方。