ULARGE_INTEGER联盟有什么意义?

Rol*_*and 4 c c++ windows winapi

http://msdn.microsoft.com/en-us/library/windows/desktop/aa383742%28v=vs.85%29.aspx

它们应该像这样使用,在LowPart和HighPart上设置两个32位值,然后在QuadPart上执行算术运算.

int a,b,c;
ULARGE_INTEGER u;
...
u.LowPart = a;
u.HighPart = b;
u.QuadPart += c;
Run Code Online (Sandbox Code Playgroud)

因此,如果您要在QuadPart(64位)上执行算术,那么您需要一个64位处理器,对吧?那么重点是什么呢?为什么不直接将值分配给QuadPart?

Dav*_*nan 7

您不需要64位处理器来对64位数据类型执行算术运算.我所知道的所有32位编译器都支持64位整数运算.如果硬件不允许本机算术,那么编译器必须生成代码来进行算术运算.通常,这将使用编译器RTL中的支持函数.

该结构旨在供不提供64位数据类型的本机支持的编译器使用.非常文档给您链接使得清楚了:

注意 您的C编译器本身可能支持64位整数.例如,Microsoft Visual C++支持__int64大小的整数类型.有关更多信息,请参阅C编译器附带的文档.

不支持本机64位整数的编译器将无法将QUADPARTunion成员视为整数.

typedef union _ULARGE_INTEGER {
  struct {
    DWORD LowPart;
    DWORD HighPart;
  };
  struct {
    DWORD LowPart;
    DWORD HighPart;
  } u;
  ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;
Run Code Online (Sandbox Code Playgroud)

并定义ULONGLONG:

#if !defined(_M_IX86)
 typedef unsigned __int64 ULONGLONG;
#else
 typedef double ULONGLONG;
#endif
Run Code Online (Sandbox Code Playgroud)

当然,在过去10年(或更长时间)内编写的所有编译器都将支持64位整数.但是这个联盟最初是在很久以前推出的,编译器的格局就不同了.在查看Windows头文件时,请始终牢记历史和遗产.

  • 从头文件中读取带引号的文本,带有#if的部分. (2认同)

Har*_*ton 5

通常ULARGE_INTEGER在需要将一对 32 位整数转换为 64 位整数时使用,反之亦然。

例如,考虑操作一个FILETIME结构:

void add_millisecond(FILETIME * ft)
{
  ULARGE_INTEGER uli;
  uli.LowPart = ft->dwLowDateTime;
  uli.HighPart = ft->dwHighDateTime;
  uli.QuadPart += 10000;
  ft->dwLowDateTime = uli.LowPart;
  ft->dwHighDateTime = uli.HighPart;
}
Run Code Online (Sandbox Code Playgroud)

您不能直接分配 QuadPart 值,因为您没有它;你所拥有的只是高低部分。