ULARGE_INTEGER联盟有什么意义?

时间:2013-02-16 22:21:49

标签: 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;

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

3 个答案:

答案 0 :(得分:7)

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

该结构旨在供不提供64位数据类型的本机支持的编译器使用。您链接的documentation非常明确:

  

注意您的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头文件时,请始终牢记历史和遗产。

答案 1 :(得分:4)

当您需要将一对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值,因为您没有它;你所拥有的只是高低部分。

答案 2 :(得分:3)

  

因此,如果您要对QuadPart(64位)执行算术运算   无论如何你需要一个64位处理器,对吗?

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

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