Определение поведения, определяемого реализацией, в C - это когда что-то оставляется на усмотрение компилятора, и компилятор документирует, какой выбор он сделал.
В языке существуют сотни таких случаев. Стандарт содержит краткое изложение большинства из них в Приложении J.3, длина которого составляет ~ 15 страниц.
Специфический c пример int i; i >> 3
является неопределенным поведением, поскольку переменная не инициализирована.
Специфический пример c int i=0; i >> 3
определяется реализацией, потому что стандарт говорит об этом. C17 6.5.7 / 5:
Результатом E1 >> E2
является бит E1 со смещением вправо E2
. / - / Если E1
имеет тип со знаком и отрицательное значение, результирующее значение определяется реализацией.
В этом конкретном случае это зависит от того, выберет ли компилятор арифметику c Сдвиг или команда логического сдвига из набора команд ЦП. Это означает, что стандарт не отрицательно относится к архитектурам, в которых отсутствует арифметическое смещение c. Хотя на практике подавляющее большинство процессоров способны производить арифметическое c смещение, даже RIS C.