Подтвердить что ты не робот

Могут ли побитовые операторы иметь поведение undefined?

Побитовые операторы (~, &, | и ^) работают с поразрядным представлением своих продвинутых операндов. Могут ли такие операции вызывать поведение undefined?

Например, оператор ~ определяется таким образом в стандарте C:

6.5.3.3 Унарные арифметические операторы

Результатом оператора ~ является поразрядное дополнение его (продвинутого) операнда (то есть каждый бит в результате устанавливается тогда и только тогда, когда соответствующий бит в преобразованном операнде не задан). Целые рекламные акции выполняются в операнде, и результат имеет продвинутый тип. Если продвинутый тип является неподписанным типом, выражение ~E эквивалентно максимальному значению, представленному в этом тире минус E.

На всех архитектурах ~0 создает бит-шаблон со знаковым битом, установленным на 1, и все биты значений, установленные на 1. В архитектуре с одним дополнением это представление соответствует отрицательному нулю. Может ли этот бит-образ быть представлением ловушки?

Существуют ли другие примеры поведения undefined, включающие простые побитовые операторы для более общих архитектур?

4b9b3361

Ответ 1

Для одной системы дополнений явно указаны возможности значений ловушки для тех, которые не поддерживают отрицательные нули в целых знаках (C11 6.2.6.2p4):

Если реализация не поддерживает отрицательные нули, поведение операторов &, |, ^, ~, < < и → с операндами, которые будут давать такое значение, равно undefined.

И снова одна система дополнений не совсем обычна; как, например, GCC не поддерживает!

C11 подразумевает, что аспекты, определенные реализацией и undefined, разрешены только для подписанных типов (C11 6.5p4).