抑制警告的单个实例:可能的数据丢失 - 由通过强制转换截断引起

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 年。我现在绝对知道答案。感谢您找到这个。

以上是关于抑制警告的单个实例:可能的数据丢失 - 由通过强制转换截断引起的主要内容,如果未能解决你的问题,请参考以下文章

抑制或避免警告 CA2214

如何抑制有关 C++ 中未使用变量的警告?

正确抑制数据表中的警告?

如何抑制可能的空引用警告

有没有办法抑制给定行的 JSHint 警告?

C、复合赋值——算术运算,转换可能会丢失信息