如何避免可能丢失数据的警告
How to avoid warnings about possible loss of data?
我得到了相当老的代码,其中存在这样的天延迟计算:
#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位将被简单地剥离并丢失。
相关文章:
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 警告 C4267"正在初始化":从'size_t'转换为"DWORD",可能会丢失数据
- 为什么分配可能会丢失数据,而不是产生编译器警告
- 如何避免警告C4244:从'ULONGLONG'转换为"双倍",可能丢失数据
- 警告:ISO C++禁止将静态“constexpr char*”数据成员的字符串常量转换为“char*”
- 警告 C4244:'argument':从 'double' 转换为"浮点数",可能会丢失数据 - C++
- VC++ 警告 C4356:无法通过派生类初始化静态数据成员
- 为什么VC C4244警告(可能丢失数据)专门处理'int'?
- 警告 C4244:"参数":从"double"转换为"int",可能会丢失数据
- 开发C++数据比较的警告
- 警告 1 警告 C4244:"参数":从"time_t"转换为"无符号 int",可能会丢失数据以及其他错误
- 警告 C4244:"参数":从"double"转换为"const int",可能会丢失数据
- 复制到较小类型的数据结构时出现数据丢失警告
- 关于非纯旧数据上的memset的编译时警告
- 如何解决在容器之间传输数据时可能出现的数据丢失警告
- 警告 C4244:'argument':从 'time_t' 转换为"无符号 int",可能会丢失数据 -- C++
- 警告 C4244:'argument':从 'int' 转换为"浮点",可能会丢失数据 (C++)
- C++警告非静态数据成员初始化程序
- 如何避免可能丢失数据的警告
- 警告:非静态数据成员初始化器只能使用-std=c++11或-std=gnu++11[默认启用]