C++ 64位Windows上long的位大小是多少?

C++ 64位Windows上long的位大小是多少?,c++,c,windows,64-bit,porting,C++,C,Windows,64 Bit,Porting,不久前,有人告诉我,long在64位机器上不是64位的,我应该始终使用int。这对我来说毫无意义。我看到一些文档(比如苹果官方网站上的文档)说,在为64位CPU编译时,long实际上是64位的。我在64位Windows上查找它,发现 窗口:long和int保持32位的长度,以及特殊的新数据类型 是为64位整数定义的 (来自) 我应该用什么?如果不是在Windows上,我是否应该将uw,sw((无符号宽度)定义为长,或者检查目标CPU位大小?如果需要使用特定长度的整数,可能应该使用一些与平台无

不久前,有人告诉我,
long
在64位机器上不是64位的,我应该始终使用
int
。这对我来说毫无意义。我看到一些文档(比如苹果官方网站上的文档)说,在为64位CPU编译时,
long
实际上是64位的。我在64位Windows上查找它,发现

  • 窗口:
    long
    int
    保持32位的长度,以及特殊的新数据类型 是为64位整数定义的
(来自)


我应该用什么?如果不是在Windows上,我是否应该将
uw
sw
((无符号宽度)定义为
,或者检查目标CPU位大小?

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

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


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

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

#include <iostream>

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

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


这里有一个-这是他们的驱动程序参考的一部分,但我相信它对于一般编程也是有效的。

在Unix世界中,对于64位平台的整数和指针的大小有一些可能的安排。两个最广泛使用的是ILP64(实际上,只有很少的例子;Cray就是其中之一)和LP64acronynms来自“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系统被放弃,取而代之的是(也就是说,根据Aspen group的建议,几乎所有后来的进入者都使用LP64;只有具有长期64位操作传统的系统才使用不同的方案)。所有现代64位Unix系统都使用LP64。MacOS X和Linux都是现代64位系统

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

如果您围绕平台无关的整数类型名称设计软件,可能会使用C99
标题,当平台上有可用的类型时,该标题提供有符号(列出)和无符号(未列出;前缀为“u”):

  • int8\u t
    -8位整数
  • int16\u t
    -16位整数
  • int32\u t
    -32位整数
  • int64\u t
    -64位整数
  • uintpttr\u t
    -大到足以容纳指针的无符号整数
  • intmax\u t
    -平台上整数的最大大小(可能大于
    int64\u t
然后,您可以在重要的地方使用这些类型对应用程序进行编码,并非常小心使用系统类型(可能会有所不同)。有一种
intptr\t
类型-用于保存指针的有符号整数类型;您应该计划不使用它,或者仅在减去两个
uintpr\t
值后使用它(
ptrdiff\u t


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

< P>不清楚问题是关于微软C++编译器还是Windows API。但是,没有[C++ ]。标签,所以我假设它是关于Windows API的。一些答案已经遭受了链接损坏,所以我提供了另一个可能损坏的链接


有关Windows API类型的信息,如
INT
LONG
等。MSDN上有一个页面:

这些信息也可以在各种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 | x86 | x64 ----------------------------+-----+--------+------- 字节,布尔值| U | 8位| 8位 ----------------------------+-----+--------+------- 短| S | 16位| 16位 USHORT,字| U | 16位| 16位 ----------------------------+-----+--------+------- INT,长| S | 32位| 32位 UINT、ULONG、DWORD | U | 32位| 32位 ----------------------------+-----+--------+------- INT|u PTR、LONG|u PTR、LPRAM | S | 32位| 64位 UINT|U PTR、ULONG|U PTR、WPARAM | U | 32位| 64位 ----------------------------+-----+--------+------- LONGLONG | S | 64位| 64位 ULONGLONG,QWORD | U | 64位| 64位
列“S/U”表示有符号/无符号。

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


您可以使用来检查这一点。

对于那些使用时间足够长的用户,64位转换与80年代中期的16位到32位转换有一些相似之处。有些计算机是IL32,有些是L32(根据旧问题调整新的表示法)。有时“int”是16位,有时是32位。别忘了这只适用于C-ish语言。其他语言有更合理的规范,其中a)编译器编写器不允许随意选择数据类型的大小,或b)数据类型的物理表示不允许”