С++, как абстракция, поддерживает "биты", представляющие одно из двух значений?

[C++11: 1.7] говорит о байтах в терминах бит:

Основным блоком памяти в модели памяти С++ является байт. Байт, по меньшей мере, достаточно большой, чтобы содержать любой элемент базового набора символов выполнения (2.3) и восьмибитовых кодовых единиц в кодировке Unicode UTF-8 и состоит из непрерывной последовательности бит, число которых равно реализации. Наименее значащий бит называется младшим битом; самый старший бит называется старшим битом. Память, доступная для программы на С++, состоит из одной или нескольких последовательностей смежных байтов. Каждый байт имеет уникальный адрес.

Однако я не могу найти нигде в стандарте, который определяет "бит".

Так верно ли говорить, что С++ не устанавливает ограничений на количество значений, которые могут быть представлены одним битом?

Разрешает ли он, скажем, биты с тремя состояниями?

Ответ 1

3.9.1.7 говорит

Типы bool, char, wchar_t и целые типы с подписью и без знака все вместе называются интегральными типами .48) Синоним интегрального типа является целым типом. Представления интегральных типов должны определять значения с использованием чистой двоичной системы нумерации .49) [Пример: это Международный стандарт допускает дополнение 2s, дополнение 1s и     знаковые представления величин для интегральных типов. - конец примера] "

Примечание 49 читает

Позиционное представление для целых чисел, которое использует двоичные цифры 0 и 1, в котором значения, представленные последовательными битами, равны аддитив, начинаются с 1 и умножаются на последовательный интеграл мощность 2, за исключением, возможно, бит с наивысшим положением. (Адаптировано из Американского национального словаря для информации Системы обработки.)

Ответ 2

Среди нормативных ссылок, перечисленных в [C++11: 1.2], есть "ISO/IEC 9899: 1999, языки программирования - C".

В свою очередь, в этом стандарте говорится:

[C99: 3.5]: 1блок хранения данных в среде выполнения, достаточно большой для хранения объекта, который может имеют одно из двух значений

Это не исключает, что бит является единицей хранения данных, которая еще больше, поэтому С++ как язык действительно может поддерживать биты с тремя состояниями.

Ответ 3

Я собираюсь не согласиться с принятым ответом, так как это эмульсируется тернарной машиной, что явно разрешено спецификацией.

§ 3.9.1/4 Незнакомые целые числа, объявленные без знака, должны подчиняться законам арифметики по модулю 2 n где n - количество бит в представлении значений этого конкретного размера целого числа. < ш > § 1.8/5 Объект тривиально-скопируемого или стандартного макета (3.9) должен занимать смежные байты хранения.
§ 3.9/9 Арифметические типы (3.9.1)... все вместе называются скалярными типами. Скалярные типы,... массивы таких типов... коллективно называются типами POD. Скалярные типы..., массивы таких типов... коллективно называются тривиально-скопируемыми типами.
§ 3.8/2 Для любого объекта... тривиально-скопируемого типа T, независимо от того, имеет ли объект допустимое значение типа T, базовые байты, составляющие объект, могут быть скопированы в массив из char или unsigned char. Если содержимое массива char или unsigned char будет скопировано обратно в объект, объект впоследствии сохранит свое исходное значение.

Проблема заключается в том, что во всех точках состояние всех тривиально-гибких многобайтовых объектов должно быть подмножаемо к массиву char и обратно без потерь. Это означает, что тернарная машина, эмулирующая машину базы 2 (как это требуется базовыми арифметическими типами с модульными "опрокидываниями" ), должна эмулировать эти опрокидывания от каждого эмулируемого байта до следующего в каждой беззнаковой многобайтовой арифметической операции.

Даже это эмульсируется на тернарной машине, медленно, но если все примитивные типы состоят из ровно 41 трита, чем все, о чем должен беспокоиться компилятор, это неподписанный опрокидывание/под, что может быть жизнеспособным. (Очевидно, что эмуляция ^, | и & также медленная, но это меньше проблемы в моем сознании), я думаю, что это можно сделать, но удивительно невыполнимо сделать стандартный соответствующий С++ компилятор для тройной машина.