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.
IMO: avviso errante, un bug. Si lamenta di 'return (RGBA >> 24) e 0xFF', ma non' return (RGBA >> 24) & 0xFE' – chux
Il codice sopra compila pulito su gcc 4.8.3. – dbush
@dbush con '-Wconversion', presumo? Correzione – wRAR