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

slwdgvem  于 2022-12-17  发布在  Windows
关注(0)|答案(8)|浏览(307)

不久前,有人告诉我long在64位机器上不是64位,我应该一直使用int。这对我来说没有意义。我看到文档(如苹果官方网站上的文档)说long在64位CPU上编译时确实是64位。我查了一下64位Windows上的内容,发现

  • Windows:longint的长度保持为32位,并且为64位整数定义了特殊的新数据类型。

(from http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2
我应该使用什么?如果不是在Windows上,我应该定义uwsw((无)符号宽度)作为long,否则检查目标CPU位大小?

zujrkrfu

zujrkrfu1#

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

6bc51xsx

6bc51xsx2#

在Unix世界里,64位平台上整数和指针的大小有几种可能的安排,其中最广泛使用的两种是ILP 64(实际上,这方面的例子很少; Cray就是这样的一个)和LP 64(几乎所有其他的)。缩写词来自“int,long,pointers are 64 bit”和“long,pointers are 64 bit”。

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

ILP 64系统被LP64系统所取代(也就是说,基于白杨小组的建议,几乎所有后来加入者都使用LP 64;只有长期继承64位操作的系统才使用不同的方案)。所有现代64位Unix系统都使用LP 64。MacOS X和Linux都是现代64位系统。
Microsoft使用不同的方案过渡到64位:LLP 64(“long long,pointers are 64-bit”)。它的优点是32位软件可以不加修改地重新编译。它的缺点是与其他人所做的不同,并且还需要修改代码以利用64位容量。总是有必要进行修改;它只是一组与Unix平台上所需的不同的修订版本。
如果您围绕平台无关的整数类型名称设计软件,可能会使用C99 <inttypes.h>头文件,当类型在平台上可用时,该头文件提供,在有符号(列出)和无符号(未列出;前缀为“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位机器上,整数数据类型的大小有不同的系统。世界不会改变。

mo49yndu

mo49yndu3#

目前还不清楚这个问题是关于微软C++编译器还是Windows API。但是,没有[c++]标记,所以我假设它是关于Windows API的。有些答案已经遭受了链接腐烂,所以我提供了另一个链接,可以腐烂。
有关INTLONG等Windows API类型的信息,MSDN上有一个页面:
Windows Data Types
这些信息也可以在各种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”列表示有符号/无符号。

ggazkfy8

ggazkfy84#

MSDN上的这篇文章引用了许多类型别名(在Windows上可用),它们的宽度更显式一些:
http://msdn.microsoft.com/en-us/library/aa505945.aspx
例如,虽然可以使用ULONGLONG来引用64位无符号整数值,但也可以使用UINT64。(ULONG和UINT32也是如此。)也许这样会更清楚一些?

ddrv8njm

ddrv8njm5#

Microsoft还为与指针大小相同的整数定义了UINT_PTR和INT_PTR。
这里有一个list of Microsoft specific types-它是他们的驱动程序参考的一部分,但我相信它对一般编程也是有效的。

ezykj2lf

ezykj2lf6#

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

#include <iostream>

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

乘以8是从字节中获取位。
当你需要一个特定的大小时,使用一个预定义的库类型通常是最简单的,如果你不想这样做,你可以用autoconf软件做一些经常发生的事情,让配置系统为所需的大小确定正确的类型。

h7appiyu

h7appiyu7#

Windows平台上long的大小为32位(4字节)。
您可以使用sizeof(long)检查这一点,它返回以字节为单位的大小。

vzgqcmou

vzgqcmou8#

对于UNIX和Windows的选择历史(不同的选择是合理的,考虑到它的代码库,微软并不是愚蠢的):通往64位的漫漫长路-双双,辛劳和麻烦,在https://queue.acm.org/detail.cfm?id=1165766 2006队列或https://dl.acm.org/doi/pdf/10.1145/1435417.1435431 2009 CACM中
注:我帮助设计了64/32位MIPS R4000,提出了导致C99的建议,<inttypes.h>并编写了解释长期动机的C99部分。

相关问题