Я не получил ни одного из ответов на данный момент. В стандарте C четко указано, что сдвиг отрицательного числа вправо - это поведение, определяемое реализацией. Это не неопределенное поведение, которое означает нечто иное. Как вы правильно цитируете (C17 6.5.7 §5):
Результат E1 >> E2 - E1 сдвинутые вправо битовые позиции E2. / - /
Если E1 имеет тип со знаком и отрицательное значение, результирующее значение определяется реализацией.
Это означает, что компилятор должен задокументировать его поведение. Период.
На практике: документ должен указывать, использует ли компилятор арифметический сдвиг вправо или логический сдвиг вправо.
Это противоположно неопределенному поведению, которое является специфическим для реализации поведением, которое не требуется документировать. Неопределенное поведение используется в двух случаях:
- Когда поведение компилятора может быть секретом реализации, который поставщик компилятора не должен раскрывать своим конкурентам.
- Когда компилятор не может документировать, как работают основные детали, такие как ячейки памяти ОС и ОЗУ.
Например, компилятору не нужно документировать порядок оценки в коде следующим образом:
a = f1() + f2();
a += f1() + f2();
Документирование порядка, в котором оцениваются подвыражения, раскрыло бы детали того, как работают внутреннее дерево выражений компилятора и оптимизатор, что, в свою очередь, показало бы, почему компилятор производит лучший код или компилируется быстрее, чем у конкурентов. Это было большим событием, когда изначально был написан стандарт C. В наши дни, когда есть отличные компиляторы с открытым исходным кодом, все меньше, так что это уже не секрет.
Точно так же компилятору не нужно документировать то, что печатает этот код:
int a;
int ptr = &a;
printf("%d", *ptr);
a
- неопределенное значение, и вывод не определен - на практике вывод зависит от того, что было сохранено в этой конкретной ячейке RAM раньше. То, что мы бы назвали «мусорной стоимостью». (Прежде чем кричать «UB», прочтите (Почему) используется неопределенное поведение неинициализированной переменной?).
person
Lundin
schedule
30.08.2018