С++, как абстракция, поддерживает "биты", представляющие одно из двух значений?
[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 трита, чем все, о чем должен беспокоиться компилятор, это неподписанный опрокидывание/под, что может быть жизнеспособным. (Очевидно, что эмуляция ^
, |
и &
также медленная, но это меньше проблемы в моем сознании), я думаю, что это можно сделать, но удивительно невыполнимо сделать стандартный соответствующий С++ компилятор для тройной машина.