环境下
所以我知道有很多问题已经解决了这个问题(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<
之类)投出这个来阻止这个警告但仍然需要做这个操作吗?
答案 0 :(得分:1)
运算符~
将数据类型提升为int
。 (这是C ++标准。)现在您有32位。您想将它们分配给16位变量answer
。这就是警告的原因。
您可以通过在按位运算符之后显式转换为16位类型来避免该警告,即:
answer = (u_short)~sum;
或更明确:
answer = static_cast<u_short>(~sum);