为什么>> 24会导致-Wconversion,但>> 23不会?

时间:2016-01-13 19:27:29

标签: c gcc compiler-warnings implicit-conversion

以下是代码:

#include <stdint.h>

unsigned char f(uint32_t RGBA)
{
  return (RGBA>>24) & 0xFF;
}

使用-Wconversion进行编译时会导致&#34;警告:从'uint32_t {aka unsigned int}'转换为'unsigned char'可能会改变其值[-Wconversion]&#34;。如果我将移位值降低到23或更低,则警告消失。

我已经查看了C99标准,我不明白这里发生了什么。如果我删除&运算符,则始终会发出警告,这可能是好的,因为表达式(在整数提升之后)的结果大于unsigned char。我唯一的想法是,对于较小的班次省略警告只是因为gcc是聪明的并且无论如何都看到结果是8位,因为标准并没有使这成为特殊情况。我在这儿吗?

为什么班次价值很重要?这是GCC的错误吗? Clang似乎没有对任何班次值发出警告。

我在64位Linux系统上使用GCC 5.3.1。

2 个答案:

答案 0 :(得分:4)

正如Shafik Yaghmour所说,这似乎是海湾合作委员会的一个错误:

GCC Bug 40752: -Wconversion generates false warnings for operands not larger than target type

它似乎自版本4.4.0以来一直存在,首次报​​道于2009-07-14,并且有5个重复。根据错误报告中的评论,似乎有一些关于如何处理它的争论。

答案 1 :(得分:-1)

至少对于gcc 5.46.x7.x,此问题具有使用演员表的简单解决方法:

#include <stdint.h>

unsigned char f(uint32_t RGBA)
{
  return (unsigned char) ((RGBA>>24) & 0xFF);
}