5

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?

4

3 回答 3

8

您不需要 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 头文件时,请始终牢记历史和遗留问题。

于 2013-02-16T22:49:32.013 回答
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;
}

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

于 2013-02-18T09:23:02.630 回答
3

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

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

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

于 2013-02-16T22:31:58.790 回答