2

私が入手した非常に古いコードがあります。そのような日数の遅延計算が存在する場所:

#define _SECOND ((ULONGLONG) 10000000)
#define _MINUTE (60 * _SECOND)
#define _HOUR   (60 * _MINUTE)
#define _DAY    (24 * _HOUR)

FILETIME CurTime;
GetSystemTimeAsFileTime(&CurTime);

ULONGLONG qwCurResult = (((ULONGLONG)CurTime.dwHighDateTime) << 32) + CurTime.dwLowDateTime;

DWORD days = (qwCurResult - SomeULONGLONGMoment) / _DAY;

もちろん、私はメッセージを受け取ります

warning C4244: 'argument' : conversion from 'ULONGLONG' to 'DWORD', possible loss of data

最新の VS2013 コンパイラで。DWORDに保存できるのは、2つの瞬間の間の丸日数になることを私は知っています。このメッセージを回避するには?

他の場所で非常に役立つ可能性があるため、この番号のすべての警告を無効にしたくありません。データ損失の可能性を回避する正しい方法はありますか? DWORD 以外のタイプで日数を数えることはできません (または、この警告の場所をコードの他の部分に移動します)。

それが避けられないと思われる場合、最善の解決策は現在の日付を取得する別のメカニズムを使用することです - SomeULONGLONGMoment (つまり ULONGLONG) を使用する型に変換する方法があれば、それを使用できます。

4

1 に答える 1

5

問題は、ULONGLONG 型が 64 ビットの符号なし数値であるのに対し、DWORD 型は 32 ビットの符号なし数値しか保持できないことです。DWORD が計算された数値を保持できることが確実にわかっている場合は、次のように単純に DWORD にキャストできます。

DWORD days = static_cast<DWORD>((qwCurResult - SomeULONGLONGMoment) / _DAY);

ただし、前述のように、32 ビットのデータが失われているため、上位 32 ビットは単純に削除されて失われます。

于 2014-06-28T14:54:11.967 に答える