Ark*_*ady 2 c++ winapi date data-loss
我得到了相当旧的代码,存在这样的天延迟计算:
#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;
Run Code Online (Sandbox Code Playgroud)
当然我收到消息
warning C4244: 'argument' : conversion from 'ULONGLONG' to 'DWORD', possible loss of data
Run Code Online (Sandbox Code Playgroud)
在现代VS2013编译器.我知道,这将是可以在DWORD中存储的两个时刻之间的完整天数.如何避免这条消息?
我不想用这个号码禁用所有警告,因为在其他地方它们可能非常有用.是否存在避免可能的数据丢失的正确方法?除了DWORD之外,我无法计算任何类型的天数(或者我只会将带有此警告的地方移动到代码的其他部分).
如果你认为这是不可避免的,最好的解决方案是使用另一种获取当前日期的机制 - 我将能够使用它,只要有方法将SomeULONGLONGMoment(即ULONGLONG)转换为它使用的类型.
小智 5
问题是ULONGLONG类型是64位无符号数,而DWORD类型只能保存32位无符号数.如果您确定DWORD可以保存计算出的数字,您可以简单地将其转换为DWORD
DWORD days = static_cast<DWORD>((qwCurResult - SomeULONGLONGMoment) / _DAY);
Run Code Online (Sandbox Code Playgroud)
但是如上所述,您将丢失32位数据,因此高32位将被剥离并丢失.
| 归档时间: |
|
| 查看次数: |
3895 次 |
| 最近记录: |