2016-01-13 41 views
10

ecco il codice:Perché 24 cause -Versione ma >> 23 no?

#include <stdint.h> 

unsigned char f(uint32_t RGBA) 
{ 
    return (RGBA>>24) & 0xFF; 
} 

quando si compila con -Wconversion provoca "attenzione: la conversione a‘unsigned char’da‘uint32_t {int unsigned alias}’può modificare il suo valore [-Wconversion]". Se si abbassa il valore di spostamento a 23 o meno, l'avviso scompare.

Ho esaminato lo standard C99 e non capisco cosa succede qui. Se rimuovo l'operatore &, l'avviso viene sempre emesso e probabilmente è positivo, poiché il risultato dell'espressione (dopo le promozioni di interi) è maggiore di unsigned char. La mia unica idea è che l'avviso sia omesso per turni più piccoli solo perché gcc è intelligente e vede che il risultato è comunque 8-bit, in quanto lo standard non rende questo caso speciale. Sono qui?

E perché il valore dello spostamento è importante? È un bug GCC? Clang sembra non produrre l'avviso per eventuali valori di spostamento.

Sto utilizzando GCC 5.3.1 su un sistema Linux a 64 bit.

+3

IMO: avviso errante, un bug. Si lamenta di 'return (RGBA >> 24) e 0xFF', ma non' return (RGBA >> 24) & 0xFE' – chux

+1

Il codice sopra compila pulito su gcc 4.8.3. – dbush

+0

@dbush con '-Wconversion', presumo? Correzione – wRAR

risposta