操纵LARGE_INTEGERS

时间:2009-09-08 17:54:07

标签: c++ int64

我正在win32下的MS dev studio中将一些代码从C转换为C ++。在旧代码中,我使用QueryPerformanceCounter()进行了一些高速计时,并对获得的__int64值进行了一些操作,特别是减号和除法。但现在在C ++下我被迫使用LARGE_INTEGER,因为这就是QueryPerformanceCounter()返回的内容。但是现在我尝试对值进行一些简单的数学运算,我得到一个错误:

错误C2676:二进制' - ':'LARGE_INTEGER'未定义此运算符或转换为预定义运算符可接受的类型

我尝试将变量强制转换为__int64,然后得到:

错误C2440:'type cast':无法从'LARGE_INTEGER'转换为'__int64'

如何解决此问题?

谢谢,

6 个答案:

答案 0 :(得分:28)

LARGE_INTEGER是64位整数和一对32位整数的并集。如果要对其进行64位算术运算,则需要从联合内部选择64位int。

LARGE_INTEGER a = { 0 };
LARGE_INTEGER b = { 0 };

__int64 c = a.QuadPart - b.QuadPart;

答案 1 :(得分:8)

这是:

LARGE_INTEGER x,y;
///
//Some codes...
///

__int64 diff = x.QuadPart - y.QuadPart

因为 QuadPart 被定义为 LONGLONG ,与 __ int64 相同。

答案 2 :(得分:6)

LARGE_INTEGER是一个联盟,documented here。您可能需要QuadPart成员。

答案 3 :(得分:2)

LARGE_INTEGER是一个联合,如果你想处理64位值,你仍然可以使用.QuadPart。

答案 4 :(得分:0)

正如{{3>}在备注部分中所述:

LARGE_INTEGER结构实际上是一个联盟。如果编译器具有对64位整数的内置支持,请使用QuadPart成员存储64位整数。否则,使用LowPart和HighPart成员存储64位整数。

因此,如果您的编译器支持64位整数,请使用如下所示的quadPart:

LARGE_INTEGER a, b;
__int64 diff = a.QuadPart - b.QuadPart

答案 5 :(得分:0)

除了答案之外,如果您要构建一个值不为零的LARGE_INTEGER,您可以分别指定低和高部分。 LowPart首先在union中定义,唯一的highPart是签名的。

LARGE_INTEGER li = {0x01234567, -1};