[C++11: 1.7]
Переговоры о байтов с точки зрения битов:
Фундаментальным хранилищем в модели памяти C ++ является байт. Байт, по крайней мере, достаточно большой, чтобы содержать любой элемент базового набора символов выполнения (2.3) и восьмибитовых кодовых единиц формы кодирования Unicode UTF-8, и состоит из непрерывной последовательности битов, число которых равно реализации. Младший значащий бит называется младшим битом; старший бит называется старшим битом. Память, доступная для программы на C ++, состоит из одной или нескольких последовательностей непрерывных байтов. Каждый байт имеет уникальный адрес.
Тем не менее, я не могу найти нигде в стандарте, который определяет «бит».
Так правильно ли говорить, что C ++ не накладывает ограничений на количество значений, которые могут быть представлены одним битом?
Допускает ли это, скажем, три состояния биты?
3.9.1.7 говорит
Типы bool, char, wchar_t, целые типы со знаком и без знака
все вместе называются целочисленными типами. 48) Синоним целочисленного типа.
целочисленный тип Представления целочисленных типов должны определять
значения с использованием чистой системы двоичной нумерации.49) [Пример: это
Международный стандарт разрешает 2 дополнения, 1 дополнение и
представления со знаком для целочисленных типов. — конец примера]
Заметка 49
читает
Позиционное представление для целых чисел, использующее двоичные цифры 0
и 1, в котором значения, представленные последовательными битами, являются
аддитивные, начинаются с 1 и умножаются на последовательный интеграл
Степень 2, кроме, возможно, для бита с самой высокой позицией.
(Адаптировано из Американского национального словаря для информации
Системы обработки.)
Среди нормативных ссылок, перечисленных в [C++11: 1.2]
is «ISO / IEC 9899: 1999, Языки программирования — C».
В свою очередь, этот стандарт гласит:
[C99: 3.5]:
1 немного
блок хранения данных в среде исполнения достаточно большой, чтобы держать предмет, который может
иметь одно из двух значений
Это не исключает, что бит является единицей хранения данных, которая еще больше, поэтому C ++ как язык действительно может поддерживать биты с тремя состояниями.
Я собираюсь не согласиться с принятым ответом, так как он эмулируется троичной машиной, что явно разрешено спецификацией.
§ 3.9.1 / 4 Целые числа без знака, объявленные как без знака, должны подчиняться законам арифметики по модулю 2N где 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 триты, то все, о чем должен беспокоиться компилятор — это беззнаковое опрокидывание / понижение, которое может быть жизнеспособным. (Очевидно, подражая ^
, |
а также &
тоже медленно, но это не проблема на мой взгляд) я думаю, что это мог сделано, но удивительно невыполнимо сделать стандартный компилятор C ++ для троичной машины.