Вопрос:
Я конвертирую код с C на С++ в MS dev studio под win32. В старом коде я делал некоторые высокоскоростные тайминги с помощью QueryPerformanceCounter() и делал несколько манипуляций с полученными значениями __int64, в частности минусом и делением. Но теперь под С++ я вынужден использовать LARGE_INTEGER, потому что это возвращает QueryPerformanceCounter(). Но теперь на строках, где я пытаюсь выполнить некоторые простые математические вычисления, я получаю сообщение об ошибке:
ошибка C2676: двоичный ‘-‘: ‘LARGE_INTEGER’ не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора
Я попытался передать переменные в __int64, но затем получим:
ошибка C2440: “тип cast”: невозможно преобразовать из “LARGE_INTEGER” в “__int64”
Как это разрешить?
Спасибо,
Лучший ответ:
LARGE_INTEGER – это объединение 64-разрядного целого числа и пары 32-разрядных целых чисел. Если вы хотите выполнить 64-разрядную арифметику на одном, вам нужно выбрать 64-битный int из объединения.
LARGE_INTEGER a = { 0 }; LARGE_INTEGER b = { 0 }; __int64 c = a.QuadPart — b.QuadPart; Ответ №1
Вот он:
LARGE_INTEGER x,y; /// //Some codes… /// __int64 diff = x.QuadPart — y.QuadPart
Поскольку QuadPart определяется как LONGLONG, то же самое, что __ int64.
Ответ №2
LARGE_INTEGER является объединением, описанным здесь. Вероятно, вам нужен член QuadPart.
Ответ №3
LARGE_INTEGER является объединением, вы все равно можете использовать .QuadPart, если хотите работать с 64-битным значением.
Ответ №4
Как говорится в Документация в разделе Примечания:
Структура LARGE_INTEGER на самом деле является объединением. Если ваш компилятор имеет встроенную поддержку для 64-битных целых чисел, используйте член QuadPart для хранения 64-битного целого числа. В противном случае используйте элементы LowPart и HighPart для хранения 64-битного целого числа.
Итак, если ваш компилятор поддерживает 64-битные целые числа, используйте quadPart следующим образом:
LARGE_INTEGER a, b; __int64 diff = a.QuadPart — b.QuadPart Ответ №5
В дополнение к ответам, если вы хотите построить LARGE_INTEGER со значением, отличным от нуля, вы можете назначить детали с низким и высоким параметрами отдельно. LowPart является первым, как определено в объединении, и единственная highPart подписана.
LARGE_INTEGER li = {0x01234567, -1};