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

这是代码:

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

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

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

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

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

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

GCC错误40752:-Wconversion为不大于目标类型的操作数生成错误警告

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