下面是代碼:爲什麼>> 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