Почему > 24 причины-Wconversion, но > 23 не делает?
вот код:
#include <stdint.h>
unsigned char f(uint32_t RGBA)
{
return (RGBA>>24) & 0xFF;
}
при компиляции с -Wconversion
это вызывает "предупреждение: преобразование в' unsigned char ' из 'uint32_t {aka unsigned int}' может изменить его значение [- Wconversion]". Если я уменьшу значение сдвига до 23 или меньше, предупреждение исчезнет.
Я просмотрел стандарт C99, и я не понимаю, что здесь происходит. Если я удалю &
оператор тогда предупреждение всегда испускается, и это, вероятно, хорошо, в результате выражения (после целочисленных акций) больше, чем unsigned char
. Моя единственная идея заключается в том, что предупреждение опускается для меньших сдвигов только потому, что gcc умный и видит, что результат 8-битный, так как стандарт не делает это особым случаем. Я здесь?
и почему значение сдвига имеет значение? Это ошибка GCC? Кажется, что Clang не производит предупреждение для любых значений сдвига.
Я использую GCC 5.3.1 в 64-разрядной системе Linux.
1 ответов
как упоминал Шафик Ягмур, это похоже на ошибку в GCC:
похоже, что он присутствует с версии 4.4.0, впервые сообщенной в 2009-07-14, и имеет 5 дубликатов. На основе замечаний в отчете об ошибке, кажется, есть некоторые дебаты о том, как справиться с этим.