Wow! Какой запутанный фрагмент кода. Попробуем это упростить:
// Calculate the delta
FILETIME delta;
delta.dwHighDateTime = ft_end->dwHighDateTime - ft_start->dwHighDateTime;
delta.dwLowDateTime = ft_end->dwLowDateTime - ft_start->dwLowDateTime;
// Convert 100ns units to double seconds.
double secs = delta.dwHighDateTime * 429.496 + delta.dwLowDateTime/1E7
На самом деле я считаю, что это неправильно. Оно должно быть:
double secs = delta.dwHighDateTime * 429.4967296 + delta.dwLowDateTime/1E7
Или еще более ясно:
double secs = (delta.dwHighDateTime * 4294967296. + delta.dwLowDateTime)/10E6
Что происходит, что высокое время умножается на 2**32
(который преобразует в 100ns единиц делится на 100 нс, чтобы дать секунд.
Обратите внимание, что это еще неправильно, потому что расчет delta
неправильно (так же, как и оригинал). Если в результате вычитания из недорасход нижней части, она не в состоянии s для заимствования из высокой части. См. Документацию Microsoft:
Не рекомендуется добавлять и вычитать значения из структуры FILETIME для получения относительных времен. Вместо этого вы должны скопировать части файла времени низкого и высокого порядка в структуру ULARGE_INTEGER, выполнить 64-разрядную арифметику для члена QuadPart и скопировать элементы LowPart и HighPart в структуру FILETIME.
Или, в данном случае, просто преобразуйте QuadPart, чтобы удвоить и разделить. Таким образом, мы в конечном итоге с:
ULARGE_INTEGER start,end;
start.LowPart = ft_start->dwLowDateTime;
start.HighPart = ft_start->dwHighDateTime;
end.LowPart = ft_end->dwLowDateTime;
end.HighPart = ft_end->dwHighDateTime;
double duration = (end.QuadPart - start.QuadPart)/1E7;
стороне: Держу пари, причина того, что отказ одолжить никогда не был замечен в том, что код никогда не просил напечатать продолжительность больше, чем за 7 минут 9 секунд (или если он, никто не внимательно посмотрел на результат).
Если вы не знаете, что он делает, то откуда вы знаете, что он работает нормально? – user2079303
Это дает мне правильный результат. На самом деле это лабораторная работа из университета, например. Но я хочу понять это целиком. –
Вам нужно посмотреть определение 'FILETIME', чтобы понять это. Это не стандарт языка. ([Посмотрел вверх] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx), добавлен тег winapi.) – DevSolar