Является ли правое смещение неопределенным поведением, если число больше ширины типа?
Я только что проверилC ++ стандарт. Кажется, следующий код не должен бытьнеопределенное поведение:
unsigned int val = 0x0FFFFFFF;
unsigned int res = val >> 34; // res should be 0 by C++ standard,
// but GCC gives warning and res is 67108863
И из стандарта:
Значение Е1 >> E2 - это E1-сдвинутые вправо битовые позиции E2.Если E1 имеет тип без знака или если E1 имеет тип со знаком и неотрицательное значение, значение результата является неотъемлемой частью отношения E1 / 2 ^ E2. Если E1 имеет тип со знаком и отрицательное значение, полученное значение определяется реализациейНед.
Согласно стандарту, поскольку 34 НЕ является отрицательным числом, переменнаяres
будет 0.
GCC выдает следующее предупреждение для фрагмента кода иres
является :67108863
предупреждение: счетчик правого сдвига>= ширина типа
Я также проверил код сборки, испускаемый GCC. Это просто звонкиSHRL
и инструкция Intel для SHRL,res
это не ноль.
Значит ли это, что GCC нереализовать стандартное поведение на платформе Intel?