我得到了很旧的代码,其中存在这样的天数延迟计算:
#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中存储的两分钟之间的整天数。如何避免此消息?
我不想禁用所有带有此数字的警告,因为在其他地方它们可能非常有用。是否存在正确的方法来避免可能的数据丢失?除DWORD之外,我无法计算任何类型的天数(否则,我将带有此警告的位置移至代码的其他部分)。
如果您认为这是不可避免的,最好的解决方案是使用另一种获取当前日期的机制-只要有办法将SomeULONGLONGMoment(即ULONGLONG)转换为它使用的类型,我就可以使用它。
问题是ULONGLONG类型是64位无符号数,而DWORD类型只能容纳32位无符号数。如果您确定DWORD可以保存计算出的数字,则可以通过以下方式将其简单地转换为DWORD:
DWORD days = static_cast<DWORD>((qwCurResult - SomeULONGLONGMoment) / _DAY);
但是,如上所述,您将丢失32位数据,因此高32位将被简单地剥离和丢失。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句