抑制警告的单个实例:可能的数据丢失 - 由于通过转换截断而导致

时间:2015-03-20 18:08:11

标签: c++

环境下

所以我知道有很多问题已经解决了这个问题(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<之类)投出这个来阻止这个警告但仍然需要做这个操作吗?

1 个答案:

答案 0 :(得分:1)

运算符~将数据类型提升为int。 (这是C ++标准。)现在您有32位。您想将它们分配给16位变量answer。这就是警告的原因。

您可以通过在按位运算符之后显式转换为16位类型来避免该警告,即:

answer = (u_short)~sum;

或更明确:

answer = static_cast<u_short>(~sum);