Оригинальная архитектура MIX содержит 6-битные байты, а память адресуется как 31-битные слова (5 байтов и бит знака). В качестве мысленного упражнения мне интересно, как язык C может функционировать в этой среде, учитывая:
- char имеет не менее 8 бит (приложение E спецификации C99).
- В разделе 8.2 раздела "6.2.2.3" ( "Указатели" ) говорится: "Когда указатель на объект преобразуется в указатель на тип символа, результат указывает на младший адресный байт объекта. Последовательные приращения результат, вплоть до размера объекта, выводит указатели на оставшиеся байты объекта". Моя интерпретация этого требования заключается в том, что он поддерживает "memcpy (& dst_obj, & src_obj, sizeof (src_obj))".
Подходы, о которых я могу думать:
- Сделайте char 31 бит, поэтому косвенное обращение через "char *" - это простой доступ к памяти. Но это делает строки расточительными (и означает, что они не совместимы с POSIX, поскольку, по-видимому, требуется 8-битные символы).
- Упакуйте три 8-битных символа в одно слово, с 7 игнорируемыми битами: "char *" может состоять из слова и индекса char внутри него. Однако это, похоже, нарушает 6.3.2.3, то есть memcpy() обязательно пропускает игнорируемые биты (которые, вероятно, имеют смысл для реального типа объекта)
- Полностью упаковать символы в слова, например. четвертый 8 бит char будет иметь 7 бит в слове 0 и один бит в слове 1. Однако это, по-видимому, требует, чтобы все объекты имели размер в 8-битных символах, например. "uint31_t" не может быть объявлен в соответствии с длиной слова, так как это снова имеет проблему memcpy().
Таким образом, похоже, что первый (расточительный) вариант использования 31-битных символов со всеми объектами, размер которых равен кратному char - правильно ли я читаю его таким образом?