92

いつも私は次のような文章を読んでいます

1 バイトが 8 ビットのサイズであることに依存しないでください

CHAR_BITビットとバイトを変換する定数として 8 の代わりに使用します。

など。これが当てはまる場合、今日、どのような現実のシステムがありますか? (これに関して C と C++ に違いがあるのか​​、それとも実際に言語に依存しないのかはわかりません。必要に応じて再タグ付けしてください。)

4

9 に答える 9

75

古いマシンでは、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ます。

于 2011-04-01T16:27:13.130 に答える
23

今日、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 ビット ワードを使用していました。)

于 2011-04-01T16:22:59.940 に答える
14

DSP で役立つ可能性のあるコードを作成している場合を除き、バイトが 8 ビットであると完全に想定する権利があります。全世界が VAX (または Intel) ではないかもしれませんが、全世界が通信し、データを共有し、共通のプロトコルを確立する必要があります。私たちは、オクテットで構築されたプロトコルに基づいて構築されたインターネット時代に生きており、バイトがオクテットではない C 実装は、これらのプロトコルを使用するのに非常に苦労します。

また、POSIX と Windows の両方に 8 ビット バイトがある (および義務付けられている) ことにも注意してください。これは、興味深い非組み込みマシンの 100% をカバーしており、最近では非 DSP 組み込みシステムの大部分もカバーしています。

于 2011-09-08T02:23:23.227 に答える
7

ウィキペディアから:

バイトのサイズは、当初、既存のテレタイプライター コード、特に米陸軍 (Fieldata) と海軍で使用されている 6 ビット コードの倍数になるように選択されました。1963 年、米国政府のさまざまな部署による互換性のないテレプリンター コードの使用を終わらせるために、7 ビット コードである ASCII が連邦情報処理標準として採用され、6 ビット バイトは商業的に廃止されました。1960 年代初頭、AT&T は最初に長距離幹線にデジタル電話を導入しました。これらは、8 ビットの µ-law エンコーディングを使用していました。この多額の投資により、8 ビット データの伝送コストが削減されることが約束されました。デジタル電話に 8 ビット コードを使用したことで、8 ビット データの「オクテット」が初期のインターネットの基本データ単位として採用されるようになりました。

于 2011-04-01T16:20:14.843 に答える
6

メインストリーム プラットフォームの平均的なプログラマーとして、1 バイトが 8 ビットでないことをあまり心配する必要はありません。ただし、CHAR_BITコードでは引き続き定数を使用し、 8 ビットバイトに依存する場所ではassert(またはそれ以上に) 使用します。static_assertそれはあなたを安全な側に置くはずです。

(私は、それが当てはまらない関連プラットフォームを認識していません)。

于 2011-04-01T16:20:13.023 に答える
4

第 1 に、ビット数はchar「システム」または「マシン」に正式には依存しませんが、この依存性は通常、常識によって暗示されます。のビット数は、実装(つまり、コンパイラ)charのみに依存します。「通常の」システムまたはマシンで 8 ビットを超えるコンパイラを実装しても問題はありません。char

次に、それぞれが 16 ビットの組み込みプラットフォームがいくつかありsizeof(char) == sizeof(short) == sizeof(int)ます (これらのプラットフォームの正確な名前は覚えていません)。また、よく知られている Cray マシンにも同様の特性があり、これらすべてのタイプに 32 ビットが含まれていました。

于 2011-06-19T15:56:36.113 に答える
2

歴史上、8 の倍数のネイティブ ワード サイズを使用しない奇妙なアーキテクチャがたくさんありました。

  • Intel による最初の商用 CPU はIntel 4004 (4 ビット)でした。
  • PDP-8 (12 ビット)

バイトのサイズは歴史的にハードウェアに依存しており、サイズを義務付ける決定的な標準は存在しません。

多くの組み込み作業を行っている場合は、覚えておくとよいでしょう。

于 2011-04-01T16:35:07.560 に答える
2

私は、CHAR_BIT が 16 の DSP コードに多くの組み込み作業を行っています。

于 2011-04-01T16:25:09.673 に答える