わお!なんと難読化されたコードでしょう。単純化してみましょう。
// 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 単位に変換してから 100ns で割って秒を与える) を掛けているということです。
の計算が間違っているため、これはまだ間違っていることに注意してくださいdelta
(元と同じ方法で)。下位部分の減算がアンダーフローすると、上位部分からの借用に失敗します。Microsoft のドキュメントを参照してください。
FILETIME 構造体の値を加算および減算して相対時間を取得することはお勧めしません。代わりに、ファイル時刻の下位部分と上位部分を ULARGE_INTEGER 構造体にコピーし、QuadPart メンバーで 64 ビット演算を実行して、LowPart メンバーと HighPart メンバーを FILETIME 構造体にコピーする必要があります。
または、実際には、この場合、QuadPart を double に変換して分割するだけです。したがって、最終的には次のようになります。
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 秒を超える長さを出力するように要求されたことがないためだと思います (または、もしそうであったとしても、誰も結果を注意深く見ていませんでした)。