这是代码:
#include <stdint.h> unsigned char f(uint32_t RGBA) { return (RGBA>>24) & 0xFF; }
当使用-Wconversion编译时,会导致“警告:转换为’unsigned char’from’uint32_t {aka unsigned int}’可能会改变其值[-Wconversion]”.如果将shift值降低到23或更小,则警告消失.
我看过C99标准,我不明白这里发生了什么.如果我删除&然后,警告总是被发出,这可能是很好的,因为表达式(整数促销之后)的结果大于unsigned char.我唯一的想法是,对于较小的班次而言,忽略了警告,因为gcc是聪明的,并且看到结果是8位,因为标准不会使这种情况变得特别.我在这里吗
为什么转移价值很重要?那是GCC的错误吗? Clang似乎不会对任何转换值产生警告.
我在64位Linux系统上使用GCC 5.3.1.
解决方法
正如Shafik Yaghmour所说,这似乎是GCC的一个错误:
GCC Bug 40752: -Wconversion generates false warnings for operands not larger than target type
自4.4.0版以来,似乎已经存在,首次在2009-07-14报道,共有5个重复.根据bug报告中的意见,似乎有一些关于如何处理它的争论.