什么是在64位Windows上长的位大小?
不久以前,有人告诉我,在64位机器上不是64位,我应该总是使用int
。 这对我来说没有意义。 我看过文档(例如苹果官方网站上的文档)说,编译64位CPU时,确实是64位。 我查了一下在64位Windows上find了什么
- Windows:
long
和int
保持32位长度,为64位整数定义特殊的新数据types。
(来自http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2 )
我应该使用什么? 我应该定义一些像uw
, sw
((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_t
types – 用于存放指针的有符号整数types; 你应该计划不使用它,或者只使用它作为减去两个uintptr_t
值( ptrdiff_t
)的结果。
但是,正如这个问题所指出的,在64位机器上,整数数据types的大小有不同的系统。 习惯它; 世界不会改变。
目前还不清楚问题是关于Microsoft C ++编译器还是Windows API。 但是,没有[c ++]标签,所以我认为它是关于Windows API的。 一些答案遭受了链接腐烂,所以我提供了另一个可能腐烂的链接。
有关Windows APItypes(如INT
, LONG
等)的信息,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是一个很好的地方。