不久前,有人告诉我long
在64位机器上不是64位,我应该总是使用int
.这对我来说没有意义.我已经看到docs(例如Apple官方网站上的文件)说long
在编译64位CPU时确实是64位.我查了64位Windows上的内容并找到了
Windows:
long
并int
保持32位长度,并为64位整数定义特殊的新数据类型.
(来自http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2)
我该怎么用?我应该定义类似uw
,sw
((UN)签署的宽度)为long
如果没有在Windows,否则做对目标CPU bitsize支票?
在Unix世界中,对于64位平台的整数和指针大小有一些可能的安排.最广泛使用的两个是ILP64(实际上,只有极少数例子; Cray就是其中之一)和LP64(几乎所有其他的).acronynms来自'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组的建议;只有具有64位操作的悠久遗产的系统使用不同的方案).所有现代64位Unix系统都使用LP64.MacOS X和Linux都是现代的64位系统.
Microsoft使用不同的方案转换为64位:LLP64('long long,指针是64位').这具有意义,即可以不经更改地重新编译32位软件.它的缺点是与其他人的不同,并且还要求修改代码以利用64位容量.总是需要修改; 它只是Unix平台上所需的一组不同的修订版.
如果您围绕平台中立的整数类型名称设计软件,可能使用C99
标头,当平台上有类型时,它提供有符号(已列出)和未签名(未列出;前缀为'u'):
int8_t
- 8位整数
int16_t
- 16位整数
int32_t
- 32位整数
int64_t
- 64位整数
uintptr_t
- 无符号整数,足以容纳指针
intmax_t
- 平台上最大的整数大小(可能大于int64_t
)
然后,您可以使用这些类型对应用程序进行编码,并对系统类型(可能不同)进行非常小心.有一种intptr_t
类型 - 用于保存指针的有符号整数类型; 你应该计划不使用它,或者只使用它作为减去两个uintptr_t
值(ptrdiff_t
)的结果.
但是,正如问题所指出的那样(难以置信),64位机器上的整数数据类型的大小有不同的系统.习惯它; 世界不会改变.
目前尚不清楚这个问题是关于Microsoft C++编译器还是Windows API.但是,没有[c ++]标签,所以我认为它是关于Windows API的.一些答案遭受链接腐烂,所以我提供了另一个可以腐烂的链接.
有关Windows API类型等的信息INT
,LONG
MSDN上有一个页面:
Windows数据类型
这些信息也可以在各种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"列表示签名/未签名.