web-dev-qa-db-ja.com

エンディアンはバイト単位のビット順序を参照できますか?

私はChrisAdamsonによる「LearningCoreAudio:A Hands-On Guide to Audio Programming for Mac and iOS」を読んでおり、ある時点で著者はビッグエンディアンを次のように説明しています。

バイトまたはワードの上位ビットは、下位ビットよりも数値的に重要です。

ただし、これまでは、ビッグリトルエンディアンの問題はbyteの順序にのみ適用され、ビットの順序には適用されませんでした。リトルエンディアンシステムとビッグエンディアンシステムのどちらについて話している場合でも、1バイトのビット順序は同じです(左から右)。私が間違っている?著者は間違っていますか?それとも私は彼の主張を誤解しましたか?

29
Meda

通常、バイト内のビットを個別にアドレス指定することはできないため、一般に「ビットエンディアン」の概念はありません。

24
Michael Burr

「ビット順序」のようなものがある唯一の意味は、ビットがビットフィールドに割り当てられる順序です。たとえば、次のようになります。

union {
    struct {
        unsigned char a:4;
        unsigned char b:4;
    } bf;
    unsigned char c;
};

実装に応じて、bf.aの表現はcの上位4ビット、またはcの下位4ビットを占める可能性があります。ビットフィールドメンバーの順序がバイト順序と一致するかどうかは、実装によって定義されます。

20
R..

これは、述べられた質問に対する答えではありません—すでに他の人によってよく答えられています—が、関連する概念を明確にすることを期待して、いくつかの用語を説明する脚注です。特に、これは c に固有のものではありません。


  • エンディアンとバイト順序

    バイトより大きい値が複数のバイトに格納またはシリアル化される場合、コンポーネントのバイトが格納される順序の選択は、バイト順序、またはエンディアン、または-と呼ばれます。 エンディアン

    歴史的に、使用されているバイトオーダーは3つあります:" big-endian "" little-endian " 、および" PDP-エンディアン "または" ミドルエンディアン "

    ビッグエンディアンおよびリトルエンディアンバイト順序名は、バイトの順序付け方法から派生します。ビッグエンディアンは最上位バイト(論理値に影響を与えるバイト)を配置します。ほとんど)最初に、重要度の高い順に連続するバイト。リトルエンディアンは最下位バイトを最初に置き、連続するバイトは重要度の高い順になります。

    整数型と 浮動小数点型 ではバイト順序が異なる場合があることに注意してください。それらは、別々のハードウェアユニットに実装することもできます。ただし、ほとんどのハードウェアでは、バイト順序は同じです。

  • ビット順序

    ビット順序は、バイトではなく個々のビットを含むことを除いて、エンディアンと非常によく似た概念です。 2つの概念は関連していますが、同じではありません。

    ビット順序は、ビットがシリアル化されている場合にのみ意味があります。たとえば、シリアルまたはSPIまたはI2Cバス;続々。

    ビットがより大きなグループで参照される場合1つの単位として並列に使用される、バイトやワードのように、順序はありません。ラベリングと-のみがあります。 重要性。 (これらは、1つずつ順番にではなく、並行してグループとしてアクセスおよび操作されるため、特定の順序はありません。グループとしての解釈は、それぞれに異なる重要性をもたらし、私たち人間はそれらにラベルを付けたり、番号を付けたりすることができます。参照のしやすさ。)

  • ビットの重要性

    ビットのグループがバイナリ値として扱われる場合、最下位ビット最上位ビットがあります。これらの名前は、最下位ビットを変更すると、ビットグループの値が可能な限り最小で変更されるという事実に由来しています。最上位ビットを変更すると、ビットグループの値が可能な限り最大量で変更されます(1ビットの変更)。

    たとえば、5ビットのグループがあるとします。たとえば、abcd、および- e、5ビットの符号なし整数値を形成します。 aが最も重要で、eが最も重要でなく、他の3つが重要度の高い順になっている場合、符号なし整数値は次のようになります。
     a・24b・23c・22d・21e・2
    つまり.
      = 16a + 8b + 4c + 2d + e

    言い換えると、ビットの重要性は、ビットのグループの数学的(または論理的)解釈から導き出され、ビットが一部のバスでシリアル化される順序から完全に分離されています。人間が割り当てたラベルまたは番号。

    これは、 浮動小数点 の数値であっても、数値を論理的に構成するすべてのビットグループに当てはまります。

  • ビットラベルまたはビットナンバリング

    たとえば、ドキュメントでの参照を容易にするために、個々のビットにラベルを付けると便利なことがよくあります。これは本質的に任意です。実際、上記の例では、文字aからfを使用しました。多くの場合、数字は文字よりも簡単です。27ビット以上を1文字でラベル付けするのはそれほど簡単ではありません。

    ビットに数字のラベルを付けるには2つの方法があります。

    現在最も一般的な方法は、ビットの重要度に応じてビットにラベルを付けることです。ビット0は最下位ビットを指します。ビットiは論理値2になるため、これは便利です。

    IBMのPOWER資料など、特定のアーキテクチャーの資料では、最上位ビットは重要度の高い順に0とラベル付けされています。この場合、ビットの論理値はそのユニットのビット数に依存します。ユニットが持っている場合 N ビット、次にビット  論理値は2ですN-i-1

    この順序は奇妙に感じるかもしれませんが、これらのアーキテクチャはすべてビッグエンディアンであり、これらのシステムでは最も重要なものが最初に来ると覚えておくと便利かもしれません。

    ただし、これは完全に恣意的な決定であり、どちらの場合も、システムの実際のパフォーマンスに影響を与えることなく、otherビットラベル付けスキームを使用してドキュメントを作成できることを忘れないでください。これは、左から右に書き込むか、右から左に(またはトップダウンで)書き込むかを選択するようなものです。内容は影響を受けません規則を理解している限り

バイト順序とビットラベリングの間にはある程度の相関関係がありますが、上記の4つの概念はすべて別個のものです。

多くのビッグエンディアンハードウェアのドキュメントでは、最上位ビットがビットゼロであるビットラベリングを使用しているという意味で、バイト順序とビットラベリングの間には相関関係がありますが、これは人間が選択したためです。

c では、Cコンパイラがビットフィールドを構造体にパックする順序は、コンパイラとアーキテクチャによって異なります。 C規格では全く規定されていません。このため、通常、バイナリファイルをビットフィールドのある構造体型に読み込むことはお勧めできません。 (特定のマシンやコンパイラで動作する場合でも、他のマシンやコンパイラで動作する保証はありません。多くの場合、動作しません。そのため、コードの移植性が低下します。)代わりに、バッファとunsigned charの配列を読み込みます。ヘルパーaccessor関数を使用して、ビットシフト(<<>>)、バイナリors(|)、およびマスキング(binary and、&)を使用して配列からビットフィールドを抽出します。

16
Nominal Animal

ビットを個別にアドレス指定できるエキゾチックなシステムを使用している場合を除いて、ビット順序に関するバイトの「エンディアン」は実際には問題ではありません。有線でデータを送信する方法を決定する際に問題になる可能性がありますが、この決定は通常、ハードウェアレベルで行われます。

オーディオ

オーディオストリーミングとの関連性に関しては、非常に重要である可能性があります。デジタルオーディオのストリームをアナログオーディオ信号に変換する責任があるハードウェアは、ストリーム内のビットが特定の順序であることを期待する場合があります。それらが間違っていると、音が完全に打ち砕かれて出てくる可能性があります。おそらくあなたの本の著者はこれについて詳しく述べていますか?とにかく、先に述べたように、これは通常ハードウェアレベルで決定され、ユーザーまたはカーネルレベルでプログラミングする場合は実際には問題になりません。一般に、業界標準では、2つのハードウェアがデータを相互に送信する方法が定義されています。すべてのハードウェアがビットエンディアンに同意している限り、すべてが正常です。

ウィキペディアでさらに読む。

11
Anthony

バイト内のビットの順序は意味がありません。バイト内のビットはアドレス指定できないため、エンディアンの定義の参照として使用するためにこのビットの順序を定義することはできません。ビットとは異なり、バイトはアドレス指定可能であるため、リトルエンディアンまたはビッグエンディアンの意味を定義するための参照として使用できるアドレス順序があります。

Left shift <<またはRight Shift >>ビット単位の演算子は、バイト内に定義されたビットの順序があることを間接的に暗示しているように見えるかもしれませんが、そうではありません。この2つの用語は、最下位ビットが右にあり、左に行くとビットの値が高くなる抽象バイト表現に基づいていますが、定義上、Left shiftは2の乗算と同じ効果があり、Right shiftは、2で除算するのと同じ効果があります(符号なし整数の場合)。

7
AlexDan