Обычно C требует, чтобы операнды бинарного оператора были переведены в тип операнда более высокого ранга. Это можно использовать, чтобы избежать заполнения кода подробными приведениями, например:
if (x-48U<10) ...
y = x+0ULL << 40;
и т.д.
Однако я обнаружил, что, по крайней мере с gcc, это поведение не работает для битовых сдвигов. * Т.е. 1006 *
int x = 1;
unsigned long long y = x << 32ULL;
Я ожидаю, что тип правого операнда вызовет повышение левого операнда до unsigned long long
, чтобы сдвиг завершился успешно. Но вместо этого gcc выдает предупреждение:
warning: left shift count >= width of type
Не нарушен ли gcc или стандарт делает какое-то исключение из правил продвижения типов для битовых сдвигов?