Язык юриста — делает C ++, как абстракцию, поддерживает «биты» представляющий одно из более чем двух значений?

[C++11: 1.7] Переговоры о байтов с точки зрения битов:

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

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

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

Допускает ли это, скажем, три состояния биты?

12

Решение

3.9.1.7 говорит

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

Заметка 49 читает

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

2

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

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

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

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

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

6

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

§ 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 ++ для троичной машины.

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