元のMIX アーキテクチャは 6 ビット バイトを特徴とし、メモリは 31 ビット ワード (5 バイトと符号ビット) としてアドレス指定されます。思考練習として、C 言語がこの環境でどのように機能するのか疑問に思っています。
- char には少なくとも 8 ビットがあります (C99 仕様の附属書 E)
- C99 仕様セクション 6.3.2.3 (「ポインター」) パラグラフ 8 には、「オブジェクトへのポインターが文字型へのポインターに変換されると、結果はオブジェクトのアドレス指定された最下位バイトを指します。結果の連続的なインクリメント、アップオブジェクトのサイズに、オブジェクトの残りのバイトへのポインターを生成します。」この要件についての私の解釈は、「memcpy(&dst_obj, &src_obj, sizeof(src_obj))」を支えているというものです。
私が考えることができるアプローチ:
- char を 31 ビットにするため、"char*" による間接参照は単純なメモリ アクセスです。しかし、これは文字列を無駄にします(明らかに8ビット文字が必要なため、POSIXに準拠していないことを意味します)
- 3 つの 8 ビット文字を 1 つのワードにパックし、7 ビットを無視します。「char*」は、ワード アドレスとその中の文字インデックスで構成される場合があります。ただし、これは 6.3.2.3 に違反しているようです。つまり、memcpy() は無視されたビットをスキップする必要があります (実際のオブジェクト タイプではおそらく意味がある)。
- char を単語に完全にパックします。たとえば、4 番目の 8 ビット char は、word 0 に 7 ビット、word 1 に 1 ビットを持ちます。これにも memcpy() 問題があるため、ワード長に一致するように宣言されています。
したがって、すべてのオブジェクトのサイズが char の倍数である 31 ビット char を使用するという最初の (無駄な) オプションが残っているようです。このように読むのは正しいですか?