Кажется, что путаница в этом вопросе проистекает из того факта, что слово "байт" в стандарте C не имеет типичного определения (которое составляет 8 бит).В частности, слово «байт» в стандарте C означает набор битов, где число битов определяется константой, определенной реализацией CHAR_BITS
.Кроме того, «байт», как определено стандартом C, представляет собой наименьший адресуемый объект , к которому может обращаться программа C.
Это оставляет открытым вопрос о том, существует ли взаимно-однозначное соответствие между определением C «адресуемого» и аппаратным определением «адресуемого».Другими словами, возможно ли, что аппаратное обеспечение может обращаться к объектам, которые меньше, чем «байт»?Если (как в OP) «байт» занимает 3 адреса, то это означает, что «байтовые» обращения имеют ограничение на выравнивание.То есть 3 и 6 являются действительными "байтовыми" адресами, а 4 и 5 - нет.Это запрещено разделом 6.2.8, в котором обсуждается выравнивание объектов.
Это означает, что архитектура, предложенная OP, не поддерживается спецификацией C.В частности, реализация может не иметь указателей, которые указывают на 4-битные объекты, когда CHAR_BIT
равен 12.
Вот соответствующие разделы из стандарта C:
§3.6 Определение «байт», используемое в стандарте
[Байт - это] адресуемая единица хранения данных, достаточно большая, чтобы вместить любой элемент базового набора символов среды выполнения.
ПРИМЕЧАНИЕ 1. Можно выразить адрес каждого отдельного байта объекта однозначно.
ПРИМЕЧАНИЕ 2. Байт состоит из непрерывной последовательности битов, число которых определяется реализацией.,Младший значащий бит называется младшим битом;самый старший бит называется старшим битом.
§5.2.4.2.1 описывает CHAR_BIT как
количество бит для наименьшего объекта, который не являетсябитовое поле (байт)
§6.2.6.1 ограничивает все объекты, которые больше чем символ, кратным битам CHAR_BIT:
[...]За исключением битовых полей, объекты состоят из смежных последовательностей из одного или нескольких байтов, число, порядок и кодирование которых либо явно указаны, либо определены реализацией.
[...] Значения, хранящиеся вобъекты не битового поля любого другого типа объекта состоят из n × CHAR_BIT битов, где n - размер объекта этого типа в байтах.
§6.2.8 ограничивает выравниваниеобъекты
Полные типы объектов имеют требования к выравниванию, которые накладывают ограничения на адреса, по которым могут быть размещены объекты этого типа.Выравнивание - это определенное реализацией целочисленное значение, представляющее число байтов между последовательными адресами , на которых может быть выделен данный объект.
Допустимые выравнивания включают только те значения, которые возвращаются выражением _Alignof для фундаментальных типов, плюс дополнительный набор значений, определенный реализацией, который может быть пустым. Каждое действительное значение выравнивания должно быть неотрицательной интегральной степенью двух .
§6.5.3.2 определяет sizeof
a char
и, следовательно, "байт"
Когда sizeof применяется к операнду с типом char, без знака или со знаком, или его квалифицированной версией, результат равен 1.