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
保持32位的长度,以及特殊的新数据类型 是为64位整数定义的int
我应该用什么?如果不是在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)数据类型的物理表示不允许”