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

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

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

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

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

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

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

14

Решение

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

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

Опять же, системы дополнения не совсем обычны; как например GCC не поддерживает ни одного!

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

10

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]