次のような文章を読むたびに
サイズが8ビットの1バイトに依存しないでください
使用する
CHAR_BIT
ビットとバイトの間で変換する定数としての8ではなく
など。今日、どのような現実のシステムがありますか? (これに関してCとC++に違いがあるのか、実際に言語に依存しないのかはわかりません。必要な場合はタグを付け直してください。)
古いマシンでは、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
という名前の型を単にサポートしない(適合しない)アプローチを取りますすべて。
今日、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を使用しました。)
DSPで役立つ可能性のあるコードを書いているのでない限り、バイトが8ビットであると想定する権利があります。全世界がVAX(またはIntel)であるとは限りませんが、全世界は通信、データの共有、共通プロトコルの確立などを行う必要があります。私たちは、オクテット上に構築されたプロトコル上に構築されたインターネット時代に住んでおり、バイトがオクテットではないC実装は、これらのプロトコルを使用するのに本当に苦労するでしょう。
また、POSIXとWindowsの両方が8ビットバイトを持っている(そして義務付けている)ことも注目に値します。これは、興味深い非組み込みマシンの100%をカバーし、最近では非DSP組み込みシステムの大部分もカバーしています。
から ウィキペディア :
バイトのサイズは、最初に既存の複数のテレタイプライターコード、特に米国陸軍(Fieldata)と海軍が使用する6ビットコードになるように選択されました。 1963年、米国政府のさまざまな支部による互換性のないテレプリンターコードの使用を終了するため、7ビットコードであるASCIIが連邦情報処理標準として採用され、6ビットバイトが商業的に廃止されました。 1960年代初頭、AT&Tは長距離トランク回線で最初にデジタルテレフォニーを導入しました。これらは8ビットのµ-lawエンコーディングを使用していました。この大規模な投資により、8ビットデータの送信コストを削減することが約束されました。デジタルテレフォニーに8ビットコードを使用すると、初期のインターネットの基本データユニットとして8ビットデータ「オクテット」が採用されました。
メインストリームプラットフォームの平均的なプログラマとして、あなたはnotを実行します。1バイトが8ビットでないことを心配する必要があります。ただし、コードではCHAR_BIT
定数を使用し、8ビットバイトに依存する場所はassert
(またはstatic_assert
)を使用します。それはあなたを安全な側に置くべきです。
(私はそれが当てはまらない関連するプラットフォームを知りません)。
第一に、char
のビット数は「システム」または「マシン」に正式に依存しませんが、この依存性は通常常識によって暗示されています。 char
のビット数は、実装(つまり、コンパイラー)のみに依存します。 「通常の」システムまたはマシンの場合、char
に8ビットを超えるコンパイラーを実装しても問題はありません。
第二に、sizeof(char) == sizeof(short) == sizeof(int)
のいくつかの組み込みプラットフォームがあり、それぞれ16ビットです(これらのプラットフォームの正確な名前は覚えていません)。また、有名なCrayマシンには同様の特性があり、これらすべてのタイプには32ビットがあります。
歴史上、ネイティブのWordサイズを使用していない場合は8の倍数であるという奇妙なアーキテクチャが数多く存在します。
バイトのサイズは歴史的にハードウェアに依存しており、サイズを強制する明確な標準は存在しません。
多くの埋め込み処理を行う場合は、覚えておくと良いでしょう。
HP Saturn のウィキペディアエントリから、参照としてもう1つ追加します。
Saturnアーキテクチャはニブルベースです。つまり、データのコアユニットは4ビットであり、1ビットのバイナリコード化された10進数(BCD)を保持できます。
私は多くの組み込みを行い、現在CHAR_BITが16のDSPコードで作業しています