Является ли правое смещение неопределенным поведением, если число больше ширины типа?

Я только что проверил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?

Ответы на вопрос(2)

Ваш ответ на вопрос