Почему > 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:

ошибка GCC 40752: - Wconversion генерирует ложные предупреждения для операндов не больше целевого типа

похоже, что он присутствует с версии 4.4.0, впервые сообщенной в 2009-07-14, и имеет 5 дубликатов. На основе замечаний в отчете об ошибке, кажется, есть некоторые дебаты о том, как справиться с этим.