2016-01-13 49 views
10

下面是代码:为什么>> 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。

+3

IMO:错误的警告,一个错误。它抱怨'返回(RGBA >> 24)&0xFF',但不是'return(RGBA >> 24)&0xFE' – chux

+1

上面的代码编译干净的gcc 4.8.3。 – dbush

+0

@dbush带'-Wconversion',我假设? – wRAR

回答

相关问题