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?
答案 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