以下是代码:
#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。
答案 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.4
,6.x
和7.x
,此问题具有使用演员表的简单解决方法:
#include <stdint.h>
unsigned char f(uint32_t RGBA)
{
return (unsigned char) ((RGBA>>24) & 0xFF);
}