web-dev-qa-db-ja.com

LARGE_INTEGERSの操作

Win32のMSdevstudioでコードをCからC++に変換しています。古いコードでは、QueryPerformanceCounter()を使用して高速タイミングを実行し、取得した__int64値、特にマイナスと除算に対していくつかの操作を行いました。しかし、C++では、QueryPerformanceCounter()が返すものであるため、LARGE_INTEGERを使用する必要があります。しかし今、私が値に対していくつかの簡単な計算をしようとすると、エラーが発生します。

エラーC2676:バイナリ '-': 'LARGE_INTEGER'は、この演算子または事前定義された演算子に受け入れられる型への変換を定義していません

変数を__int64にキャストしようとしましたが、次のようになります。

エラーC2440:「型キャスト」:「LARGE_INTEGER」から「__int64」に変換できません

これを解決するにはどうすればよいですか?

ありがとう、

14
Mick

LARGE_INTEGERは、64ビット整数と32ビット整数のペアの和集合です。 1つで64ビット演算を実行する場合は、ユニオン内から64ビット整数を選択する必要があります。

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

__int64 c = a.QuadPart - b.QuadPart;
28
Jorge Ferreira

ここにあります:

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

__int64 diff = x.QuadPart - y.QuadPart

QuadPart[〜#〜] longlong [〜#〜]として定義されているため、__ int64と同じです。

8
Isaac

LARGE_INTEGERはユニオンです ここに記載されています 。おそらくQuadPartメンバーが必要です。

6
Cat Plus Plus

LARGE_INTEGER は共用体ですが、64ビット値で作業する場合は引き続き.QuadPartを使用できます。

2
jcopenha

答えに加えて、ゼロ以外の値でLARGE_INTEGERを作成しようとしている場合は、低い部分と高い部分を別々に割り当てることができます。 LowPartは最初にユニオンで定義されたとおりであり、highPartのみが署名されます。

LARGE_INTEGER li = {0x01234567, -1};
0
M.Boelter

DocumentationRemarksセクションで述べているように:

LARGE_INTEGER構造体は実際には和集合です。コンパイラに64ビット整数のサポートが組み込まれている場合は、QuadPartメンバーを使用して64ビット整数を格納します。それ以外の場合は、LowPartメンバーとHighPartメンバーを使用して64ビット整数を格納します。

したがって、コンパイラが64ビット整数をサポートしている場合は、次のようにquadPartを使用します。

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