стандарт С++
Если реализация C++14 включает биты заполнения в базовых байтах unsigned int
, указывает ли стандарт, что побитовые операции не должны выполняться с битами заполнения?
Кроме того, указывает ли стандарт С++ 14, должны ли операторы равенства и отношения игнорировать биты заполнения?
Методические рекомендации
Если в этом вопросе отсутствует спецификация, существует ли какой-то консенсус в отношении ожидаемого поведения этих операторов при заполнении битов?
Я нашел противоречивые ответы на Stack Overflow. Легкие гонки на орбите и ecatmur говорят, что побитовые операторы не подходят для арифметики, потому что они применяются ко всем битам (включая биты заполнения), в то время как Кристоф и Бартек Банашевич говорят, что побитовые операторы работают с логическим значением целых чисел и игнорировать заполнение.
использованная литература
Связанные ответы: о наличии битов заполнения (1, 2, 3), в связи с отсутствием четкой спецификации C++ (4).
Определение битов заполнения в C++14 - § 3.9.1 - Основные типы:
Для узких типов символов все биты представления объекта участвуют в представлении значения. Для узких типов символов без знака все возможные битовые комбинации представления значения представляют числа. Эти требования не распространяются на другие типы.
Определение представления объекта и представления значения в C++14 — § 3.9 — Типы:
Объектное представление объекта типа
T
— это последовательность из Nunsigned char
объектов, занимаемых объектом типаT
, где N равноsizeof(T)
. Представление значения объекта — это набор битов, которые содержат значение типаT
. Для тривиально копируемых типов представление значения представляет собой набор битов в представлении объекта, который определяет значение, которое является одним дискретным элементом набора значений, определяемого реализацией.44Сноска 44) Цель состоит в том, чтобы модель памяти C++ была совместима с моделью памяти языка C ISO/IEC 9899.
Определение побитового И в С++ 14 - § 5.11 - Побитовый оператор И:
Выполняются обычные арифметические преобразования; результатом является побитовая функция И операндов. Оператор применяется только к целочисленным операндам или операндам перечисления с незаданной областью.
Определение сложения в C++14 — § 5.7 — Аддитивные операторы:
Обычные арифметические преобразования выполняются для операндов арифметического или перечислительного типа. Кроме того, [...] оба операнда должны иметь арифметический тип или тип перечисления с незаданной областью [...]. Результатом бинарного оператора
+
является сумма операндов.
~
и оператор равенства==
работают со всеми битами (включая биты заполнения), и если унарный оператор вычитания-
работает только с битами значения, то~(-1) == 0
будет ложным. - person RalphS   schedule 19.01.2018bool
действительно имеет только два значения, но всегда занимает как минимум один полный байт, а иногда и больше (в некоторых случаях целое 32-битное слово). - person Jerry Coffin   schedule 19.01.2018