web-dev-qa-db-ja.com

1バイト!= 8ビットのシステム?

次のような文章を読むたびに

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

使用する CHAR_BITビットとバイトの間で変換する定数としての8ではなく

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

85
Xeo

古いマシンでは、8ビットより小さいコードはかなり一般的でしたが、それらのほとんどは何年も前に死んでしまいました。

CとC++では、少なくともC89標準と同じくらい、charに対して8ビットの最小が義務付けられています。 [編集:たとえば、C90、§5.2.4.2.1ではCHAR_BIT> = 8およびUCHAR_MAX> =255。C89は異なるセクション番号(I believe§2.2.4.2.1)を使用しますが、内容は同じです]。これらは、「char」と「byte」を本質的に同義語として扱います[編集:たとえば、CHAR_BITは、「ビットフィールド(バイト)ではない最小のオブジェクトのビット数」と記述されています。]

ただし、現在のマシン(主にDSP)では、最小のタイプが8ビットよりも大きく、最低でも12、14、または16ビットが一般的です。 Windows CEはほぼ同じことを行います。その最小の型(少なくともMicrosoftのコンパイラーを使用)は16ビットです。それらはnotを行いますが、charを16ビットとして扱います-代わりにcharという名前の型を単にサポートしない(適合しない)アプローチを取りますすべて。

67
Jerry Coffin

今日、x86プロセッサー上のC++の世界では、1バイトが8ビットであることに依存することは非常に安全です。ワードサイズが2のべき乗でないプロセッサ(8、16、32、64)は非常にncommonです。

常にそうではなかった。

Control Data 6600(およびその兄弟)の中央処理装置は60ビットのWordを使用し、一度に1つのWordしかアドレスできませんでした。ある意味では、CDC 6600の「バイト」は60ビットでした。

DEC-10バイトポインターハードウェアは、任意のサイズのバイトで機能しました。バイトポインターには、ビット単位のバイトサイズが含まれていました。バイトがWordの境界にまたがることができるかどうかは覚えていません。できなかったと思います。つまり、バイトサイズが3、4、9、または18ビットでなければ、Wordごとに無駄なビットがいくつかあることになります。 (DEC-10は36ビットWordを使用しました。)

23
John R. Strohm

DSPで役立つ可能性のあるコードを書いているのでない限り、バイトが8ビットであると想定する権利があります。全世界がVAX(またはIntel)であるとは限りませんが、全世界は通信、データの共有、共通プロトコルの確立などを行う必要があります。私たちは、オクテット上に構築されたプロトコル上に構築されたインターネット時代に住んでおり、バイトがオクテットではないC実装は、これらのプロトコルを使用するのに本当に苦労するでしょう。

また、POSIXとWindowsの両方が8ビットバイトを持っている(そして義務付けている)ことも注目に値します。これは、興味深い非組み込みマシンの100%をカバーし、最近では非DSP組み込みシステムの大部分もカバーしています。

14
R..

から ウィキペディア

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

7
Daniel A. White

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

(私はそれが当てはまらない関連するプラットフォームを知りません)。

6

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

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

5
AnT

歴史上、ネイティブのWordサイズを使用していない場合は8の倍数であるという奇妙なアーキテクチャが数多く存在します。

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

バイトのサイズは歴史的にハードウェアに依存しており、サイズを強制する明確な標準は存在しません。

多くの埋め込み処理を行う場合は、覚えておくと良いでしょう。

2
John Leidegren

HP Saturn のウィキペディアエントリから、参照としてもう1つ追加します。

Saturnアーキテクチャはニブルベースです。つまり、データのコアユニットは4ビットであり、1ビットのバイナリコード化された10進数(BCD)を保持できます。

1
auselen

私は多くの組み込みを行い、現在CHAR_BITが16のDSPコードで作業しています

1
dubnde