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