抑制警告的单个实例:可能的数据丢失 - 由通过强制转换截断引起
Posted
技术标签:
【中文标题】抑制警告的单个实例:可能的数据丢失 - 由通过强制转换截断引起【英文标题】:Suppress single instance of the warning: possible loss of data - caused by truncation through casting 【发布时间】:2015-03-20 18:08:10 【问题描述】:情况
所以我知道(e.g.) 已经有很多问题可以解决这个问题,但我认为我的问题相当具体,所以我还是会问它。我已将原始 ping.c 代码转换为运行在RTEMS
上的程序,这是一个嵌入式操作系统(对故事来说不是很重要,但很有趣)。在原始代码中有一个校验和生成器,最后是以下行:
answer = ~sum; // truncate to 16 bits
地点:
OSINT sum;
u_short answer;
所以这种截断是期望的行为,但它显然会抛出这个警告:
Warning 30 warning C4244: '=' : conversion from 'OSINT' to 'u_short', possible loss of data
问题
是否可以取消此警告?由于所需的行为是截断,这似乎是不可能的?
否则,有没有办法解决这个问题,我可以用某种方式(static_Cast<
等)来停止这个警告并且仍然需要做这个操作吗?
【问题讨论】:
Disable warning in MSVC++2010的可能重复 @xaxxon 我不认为这是一个骗局,我不包括头文件,操作系统和答案与我遇到的问题不匹配。 无论如何,该链接都有标题中问题的实际答案。 @xaxxon 现在没有了。 【参考方案1】:运算符~
将数据类型提升为int
。 (这是 C++ 标准。)现在你有了 32 位。并且您想将它们分配给 16 位变量answer
。这就是警告的原因。
您可以通过在按位运算符之后显式转换为 16 位类型来避免警告,即:
answer = (u_short)~sum;
或者更明确一点:
answer = static_cast<u_short>(~sum);
【讨论】:
哇,这个问题怎么躲了我 4 年。我现在绝对知道答案。感谢您找到这个。以上是关于抑制警告的单个实例:可能的数据丢失 - 由通过强制转换截断引起的主要内容,如果未能解决你的问题,请参考以下文章