Как избежать предупреждений о возможной потере данных?

Есть довольно старый код, который я получил, где существуют такие расчеты задержки дней:

#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) для типов, которые он использует.

2

Решение

Проблема заключается в том, что тип ULONGLONG представляет собой 64-разрядное число без знака, в то время как тип DWORD может содержать только 32 бита числа без знака. Если вы точно знаете, что DWORD может содержать вычисленное число, вы можете просто привести его к DWORD, сказав

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

Однако, как указано, вы теряете 32 бита данных, поэтому старшие 32 бита будут просто удалены и потеряны.

5

Другие решения


По вопросам рекламы [email protected]