いつも私は次のような文章を読んでいます
1 バイトが 8 ビットのサイズであることに依存しないでください
CHAR_BIT
ビットとバイトを変換する定数として 8 の代わりに使用します。
など。これが当てはまる場合、今日、どのような現実のシステムがありますか? (これに関して C と C++ に違いがあるのか、それとも実際に言語に依存しないのかはわかりません。必要に応じて再タグ付けしてください。)
いつも私は次のような文章を読んでいます
1 バイトが 8 ビットのサイズであることに依存しないでください
CHAR_BIT
ビットとバイトを変換する定数として 8 の代わりに使用します。
など。これが当てはまる場合、今日、どのような現実のシステムがありますか? (これに関して C と C++ に違いがあるのか、それとも実際に言語に依存しないのかはわかりません。必要に応じて再タグ付けしてください。)
古いマシンでは、8 ビット未満のコードがかなり一般的でしたが、それらのほとんどは何年も前に死んで消えてしまいました。
C および C++ では、少なくとも C89 標準までさかのぼって、 に最低8 ビットを義務付けています。char
[編集: たとえば、C90、§5.2.4.2.1 はCHAR_BIT
>= 8 およびUCHAR_MAX
>= 255 を必要とします。C89 は異なるセクション番号 ( §2.2.4.2.1になると思います) を使用しますが、内容は同じです]。彼らは「char」と「byte」を本質的に同義として扱います[編集:たとえば、CHAR_BIT
「ビットフィールド(バイト)ではない最小のオブジェクトのビット数」と記述されています。
ただし、現在のマシン (主に DSP) では、最小の型が 8 ビットより大きいものがあります。最小の 12、14、さらには 16 ビットがかなり一般的です。Windows CE もほぼ同じことを行います。最小の型 (少なくとも Microsoft のコンパイラでは) は 16 ビットです。しかし、それらはa を 16 ビットとして扱いませんchar
。代わりに、名前付きの型をまったくサポートしないという (非準拠の) アプローチを取りchar
ます。
今日、x86 プロセッサ上の C++ の世界では、1 バイトが 8 ビットであることに依存することはかなり安全です。ワード サイズが 2 の累乗 (8、16、32、64) でないプロセッサは非常にまれです。
いつもそうではありませんでした。
Control Data 6600 (およびその兄弟) 中央処理装置は 60 ビット ワードを使用し、一度に 1 ワードしかアドレス指定できませんでした。ある意味では、CDC 6600 の「バイト」は 60 ビットでした。
DEC-10 バイト ポインター ハードウェアは、任意のサイズのバイトで動作しました。バイト ポインタには、バイト サイズがビット単位で含まれていました。バイトが単語の境界にまたがるかどうかは覚えていません。つまり、バイト サイズが 3、4、9、または 18 ビットでない場合、ワードごとにいくつかの無駄なビットが発生します。(DEC-10 は 36 ビット ワードを使用していました。)
DSP で役立つ可能性のあるコードを作成している場合を除き、バイトが 8 ビットであると完全に想定する権利があります。全世界が VAX (または Intel) ではないかもしれませんが、全世界が通信し、データを共有し、共通のプロトコルを確立する必要があります。私たちは、オクテットで構築されたプロトコルに基づいて構築されたインターネット時代に生きており、バイトがオクテットではない C 実装は、これらのプロトコルを使用するのに非常に苦労します。
また、POSIX と Windows の両方に 8 ビット バイトがある (および義務付けられている) ことにも注意してください。これは、興味深い非組み込みマシンの 100% をカバーしており、最近では非 DSP 組み込みシステムの大部分もカバーしています。
ウィキペディアから:
バイトのサイズは、当初、既存のテレタイプライター コード、特に米陸軍 (Fieldata) と海軍で使用されている 6 ビット コードの倍数になるように選択されました。1963 年、米国政府のさまざまな部署による互換性のないテレプリンター コードの使用を終わらせるために、7 ビット コードである ASCII が連邦情報処理標準として採用され、6 ビット バイトは商業的に廃止されました。1960 年代初頭、AT&T は最初に長距離幹線にデジタル電話を導入しました。これらは、8 ビットの µ-law エンコーディングを使用していました。この多額の投資により、8 ビット データの伝送コストが削減されることが約束されました。デジタル電話に 8 ビット コードを使用したことで、8 ビット データの「オクテット」が初期のインターネットの基本データ単位として採用されるようになりました。
メインストリーム プラットフォームの平均的なプログラマーとして、1 バイトが 8 ビットでないことをあまり心配する必要はありません。ただし、CHAR_BIT
コードでは引き続き定数を使用し、 8 ビットバイトに依存する場所ではassert
(またはそれ以上に) 使用します。static_assert
それはあなたを安全な側に置くはずです。
(私は、それが当てはまらない関連プラットフォームを認識していません)。
第 1 に、ビット数はchar
「システム」または「マシン」に正式には依存しませんが、この依存性は通常、常識によって暗示されます。のビット数は、実装(つまり、コンパイラ)char
のみに依存します。「通常の」システムまたはマシンで 8 ビットを超えるコンパイラを実装しても問題はありません。char
次に、それぞれが 16 ビットの組み込みプラットフォームがいくつかありsizeof(char) == sizeof(short) == sizeof(int)
ます (これらのプラットフォームの正確な名前は覚えていません)。また、よく知られている Cray マシンにも同様の特性があり、これらすべてのタイプに 32 ビットが含まれていました。
歴史上、8 の倍数のネイティブ ワード サイズを使用しない奇妙なアーキテクチャがたくさんありました。
バイトのサイズは歴史的にハードウェアに依存しており、サイズを義務付ける決定的な標準は存在しません。
多くの組み込み作業を行っている場合は、覚えておくとよいでしょう。
私は、CHAR_BIT が 16 の DSP コードに多くの組み込み作業を行っています。