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 中的两个时刻之间的完整天数。如何避免此消息?

我不想禁用这个数字的所有警告,因为在其他地方它们可能非常有用。是否存在避免可能丢失数据的正确方法?除了 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 回答