Манипулирование LARGE_INTEGERS

Я конвертирую код с C на С++ в MS dev studio под win32. В старом коде я делал некоторые высокоскоростные тайминги с помощью QueryPerformanceCounter() и делал несколько манипуляций с полученными значениями __int64, в частности минусом и делением. Но теперь под С++ я вынужден использовать LARGE_INTEGER, потому что это возвращает QueryPerformanceCounter(). Но теперь на строках, где я пытаюсь выполнить некоторые простые математические вычисления, я получаю сообщение об ошибке:

ошибка C2676: двоичный '-': 'LARGE_INTEGER' не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора

Я попытался передать переменные в __int64, но затем получим:

ошибка C2440: "тип cast": невозможно преобразовать из "LARGE_INTEGER" в "__int64"

Как это разрешить?

Спасибо,

Ответ 1

LARGE_INTEGER - это объединение 64-разрядного целого числа и пары 32-разрядных целых чисел. Если вы хотите выполнить 64-разрядную арифметику на одном, вам нужно выбрать 64-битный int из объединения.

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

__int64 c = a.QuadPart - b.QuadPart;

Ответ 2

Вот он:

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

__int64 diff = x.QuadPart - y.QuadPart

Поскольку QuadPart определяется как LONGLONG, то же самое, что __ int64.

Ответ 3

LARGE_INTEGER является объединением, описанным здесь. Вероятно, вам нужен член QuadPart.

Ответ 4

LARGE_INTEGER является объединением, вы все равно можете использовать .QuadPart, если хотите работать с 64-битным значением.

Ответ 5

Как говорится в Документация в разделе Примечания:

Структура LARGE_INTEGER на самом деле является объединением. Если ваш компилятор имеет встроенную поддержку для 64-битных целых чисел, используйте член QuadPart для хранения 64-битного целого числа. В противном случае используйте элементы LowPart и HighPart для хранения 64-битного целого числа.

Итак, если ваш компилятор поддерживает 64-битные целые числа, используйте quadPart следующим образом:

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

Ответ 6

В дополнение к ответам, если вы хотите построить LARGE_INTEGER со значением, отличным от нуля, вы можете назначить детали с низким и высоким параметрами отдельно. LowPart является первым, как определено в объединении, и единственная highPart подписана.

LARGE_INTEGER li = {0x01234567, -1};