下面是代码:为什么>> 24导致-WConversion但是>> 23不导致?
#include <stdint.h>
unsigned char f(uint32_t RGBA)
{
return (RGBA>>24) & 0xFF;
}
当与-Wconversion
它会导致编译“警告:转换从‘无符号字符’‘uint32_t的{又名无符号整型}’可以改变其值[-Wconversion]”。如果我将换档值降低到23以下,警告消失。
我查看了C99标准,我不明白这里会发生什么。如果我删除了&
运算符,则警告总是会发出,这可能是好的,因为表达式(整数提升后)的结果大于unsigned char
。我唯一的想法是,对于较小的移位,警告被忽略,因为gcc很聪明,并且无论如何都看到结果是8位,因为标准没有使这个特例成为特例。我在这里吗?
为什么移位值很重要?这是一个GCC的错误?铿锵似乎没有产生任何移位值的警告。
我在64位Linux系统上使用GCC 5.3.1。
IMO:错误的警告,一个错误。它抱怨'返回(RGBA >> 24)&0xFF',但不是'return(RGBA >> 24)&0xFE' – chux
上面的代码编译干净的gcc 4.8.3。 – dbush
@dbush带'-Wconversion',我假设? – wRAR