Побитовые операторы (~
, &
, |
и ^
) работают с поразрядным представлением своих продвинутых операндов. Могут ли такие операции вызывать поведение undefined?
Например, оператор ~
определяется таким образом в стандарте C:
6.5.3.3 Унарные арифметические операторы
Результатом оператора
~
является поразрядное дополнение его (продвинутого) операнда (то есть каждый бит в результате устанавливается тогда и только тогда, когда соответствующий бит в преобразованном операнде не задан). Целые рекламные акции выполняются в операнде, и результат имеет продвинутый тип. Если продвинутый тип является неподписанным типом, выражение~E
эквивалентно максимальному значению, представленному в этом тире минусE
.
На всех архитектурах ~0
создает бит-шаблон со знаковым битом, установленным на 1
, и все биты значений, установленные на 1
. В архитектуре с одним дополнением это представление соответствует отрицательному нулю. Может ли этот бит-образ быть представлением ловушки?
Существуют ли другие примеры поведения undefined, включающие простые побитовые операторы для более общих архитектур?