ULARGE_INTEGER并集的意义何在

What is the point of the ULARGE_INTEGER union?

本文关键字:INTEGER ULARGE      更新时间:2023-10-16

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;

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

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

该结构旨在供不提供64位数据类型本机支持的编译器使用。您所链接的文档清楚地表明了这一点:

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

不支持本机64位整数的编译器将无法将QUADPART联合成员视为整数。

typedef union _ULARGE_INTEGER {
  struct {
    DWORD LowPart;
    DWORD HighPart;
  };
  struct {
    DWORD LowPart;
    DWORD HighPart;
  } u;
  ULONGLONG QuadPart;
} ULARGE_INTEGER, *PULARGE_INTEGER;

ULONGLONG:的定义

#if !defined(_M_IX86)
 typedef unsigned __int64 ULONGLONG;
#else
 typedef double ULONGLONG;
#endif

当然,所有在过去10年(或更长时间)编写的编译器都将支持64位整数。但这个联合最初是在很久以前引入的,当时的编译器环境会有所不同。查看Windows头文件时,请始终牢记历史和遗留问题。

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

例如,考虑操纵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;
}

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

因此,如果要对QuadPart(64位)执行算术运算不管怎样,你需要一个64位处理器,对吧?

没有。但真正的问题应该是,你需要一个支持64位整数类型的编译器吗?在这种情况下,答案也是否定的。这就是这些功能的用途:

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