Битовые операторы (~
, &
, |
а также ^
) оперируют побитовым представлением их повышенных операндов. Могут ли такие операции вызывать неопределенное поведение?
Например, ~
оператор определяется таким образом в стандарте C:
6.5.3.3 Унарные арифметические операторы
Результат
~
Оператор является побитовым дополнением своего (повышенного) операнда (то есть каждый бит в результате устанавливается тогда и только тогда, когда соответствующий бит в преобразованном операнде не установлен). Целочисленные продвижения выполняются над операндом, и результат имеет продвинутый тип. Если повышенный тип является типом без знака, выражение~E
эквивалентно максимальному значению, представляемому в этом типе минусE
,
На всех архитектурах, ~0
создает битовый шаблон с битом знака, установленным в 1
и все биты значения установлены в 1
, В архитектуре дополнения это представление соответствует отрицательному нулю. Может ли этот битовый шаблон быть представлением ловушки?
Существуют ли другие примеры неопределенного поведения с использованием простых побитовых операторов для более распространенных архитектур?
Для систем дополнения явно указана возможность значений ловушек для тех, которые не поддерживают отрицательные нули в целые числа со знаком (C11 6.2.6.2p4):
Если реализация не поддерживает отрицательные нули, поведение &, |, ^, ~, <<и >> операторы с операндами, которые могли бы создать такое значение, не определены.
Опять же, системы дополнения не совсем обычны; как например GCC не поддерживает ни одного!
С11 подразумевает, что определенные реализацией и неопределенные аспекты просто разрешено подписанный типы (C11 6.5p4).
Других решений пока нет …