2016-01-13 81 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

回答

相關問題