我正在win32下的MS dev studio中将一些代码从C转换为C ++。在旧代码中,我使用QueryPerformanceCounter()进行了一些高速计时,并对获得的__int64值进行了一些操作,特别是减号和除法。但现在在C ++下我被迫使用LARGE_INTEGER,因为这就是QueryPerformanceCounter()返回的内容。但是现在我尝试对值进行一些简单的数学运算,我得到一个错误:
错误C2676:二进制' - ':'LARGE_INTEGER'未定义此运算符或转换为预定义运算符可接受的类型
我尝试将变量强制转换为__int64,然后得到:
错误C2440:'type cast':无法从'LARGE_INTEGER'转换为'__int64'
如何解决此问题?
谢谢,
答案 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};