ULARGE_INTEGER并集的意义何在
What is the point of the ULARGE_INTEGER union?
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
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 使用IPC/共享内存将Integer数组从C++传递到Python
- C++ OpenCV Randu 函数抛出'Integer division by zero'
- 如何在满足常量表达式的同时将整数传递给指针,传递给 std::array<double、integer>?
- 在C++初始化程序列表中使用Integer Literals
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- 如果我获得Integer和Double的产品,输出的数据类型是什么
- C Integer在C 代码中使用时会失去其恒定状态
- 将 int 与 double 进行比较的预处理器"invalid integer constant expression"
- 编译 C++ 代码时"Error: comparison between pointer and integer"
- Bitwise integer concationation
- DIS(P X)-X在GCC Linux X86-64 C 中始终导致Pointer P和Integer X的P
- 将cryptopp :: Integer转换为lpctstr
- 如何在C++中为integer、float和double数据类型同时重载运算符
- 初始化Integer字面形式到std :: size_t
- OpenCV文档说"uchar"是"unsigned integer"数据类型。如何?
- Arduino Integer error
- C签署的基于Integer的攻击
- 这是什么C++语言结构:#(即哈希)整数"path_to_header_or_cpp_file"<integer>?
- 使用多个文件时"array bound is not an integer constant before ']' token"