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