【问题标题】:How to fix this warning : conversion to 'unsigned char' from 'int' may alter its value如何解决此警告:从“int”转换为“unsigned char”可能会改变其值
【发布时间】:2011-05-18 09:02:54
【问题描述】:

我在编译库时收到此警告。

警告:从 'int' 转换为 'unsigned char' 可能会改变其值

这会阻止我们使用编译器选项 -Werror。

谁能建议解决这个警告的方法???

【问题讨论】:

  • 触发该警告的实际代码是什么?
  • 您需要在 RTMessage.inl:166 周围发布代码

标签: c++ compiler-construction


【解决方案1】:

编译器警告您int 可能包含不适合unsigned char 的值。

如果你绝对确定在这种情况下它总是合适的,你可以使用static_cast告诉编译器

c = static_cast<unsigned char>(i);

编译器会相信你(如果它不是真的,那是你的错)。

【讨论】:

  • 如果不合适,可能根本不是故障。只要你想要的是iUCHAR_MAX+1 的值,在unsigned char 中,那么这就是它给你的。演员表告诉编译器您想要该结果,而不是 i 将始终在范围内 0-UCHAR_MAX :-) 如果您确实希望该值在范围内,那么我认为 boost::numeric_cast 更准确地表达了这一点.
【解决方案2】:

在黑暗中拍摄:

使用static_cast 指示编译器您知道转换不会导致截断:int i; unsigned char c = static_cast&lt;unsigned char&gt;(i);

如果您不确定,请查看boost::numeric_cast

在这种情况下,它等同于 static_cast,但更明确(更容易 grep / 搜索数字转换)。此外,它还执行边界检查。

【讨论】:

  • 。感谢您的回复。在我们的库 _flags&= ~x 中,我们在这种情况下收到警告,其中 x 是 int,_flags 是 unsigned char。我们应该如何在这里使用 static_cast 来消除警告?
  • @Kundan: _flags &amp;= static_cast&lt;unsigned char&gt;(~x);,但你确定~x 确实做到了你想要的吗?如果 x 在您实际尝试对其进行位操作之前是 unsigned char 类型会更简单。
【解决方案3】:

最明显的答案是找出如何在编译器上禁用该警告。从其他 cmets,你正在做:

flags &= ~x;

警告这种典型习语的编译器是脑死的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2016-05-09
    • 2012-04-28
    • 2014-12-27
    • 1970-01-01
    相关资源
    最近更新 更多