2013-05-28 12 views
14

私は「学習のCore Audio:MacとiOS用のオーディオプログラミングのハンズオンガイド」を読んでいる:Aの上位ビットをエンディアンはバイト内のビット順序を参照できますか?

クリス・アダムソンによって1点で、著者のようにビッグエンディアンを説明バイトまたはワードは、下位のワードよりも数値的に重要です。

しかし、今までのIビッグリトルエンディアンの問題はバイトためではなくビット順に適用されても。リトルエンディアンまたはビッグエンディアンシステムについて話していても、1バイトのビット順序は同じです(左から右へ)。私が間違っている?著者は間違っていますか?あるいは私は彼の意見を誤解しましたか?

答えて

12

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

+2

しかし、シフトなどのビット単位の操作を行うときは、「アドレス指定」しないでください。 – Meda

+3

シフティング時には、より大きな単位(バイト、整数など)の一部としてビットを扱います。エンディアンは、大きなオブジェクトをバイトごとに直接アドレス指定できる場合にのみ重要です。これらの個々にアドレス指定可能なバイトが大きなオブジェクト内にどのように配置されるかを知る必要があります。 –

+3

@Medaビットシフトのレベルが1バイトになると、 "表現"(それに対応する数字)が分解され、1と0の任意のコレクションになります。与えられた「方向」の回転(ROL、ROR、RCL、RCR)またはシフト(SHL、SHR ...)に沿って渡される命令は、数値そのものと同様に抽象的なものです。 –

7

「ビットオーダー」というようなことがある唯一の感覚は、ビットフィールドにビットが割り当てられる順序です。例えば、中:

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

実装に応じて、bf.aの表現はcの高い4ビット、又はcの低い4ビットを占有する可能性があります。ビットフィールドメンバの順序付けがバイト順と一致するかどうかは、実装定義です。

6

バイトの「エンディアン」はビットを別々にアドレス指定できるエキゾチックなシステムで作業していない限り、実際には問題にはなりません。ワイヤを介してデータを送信する方法を決定する際には問題になる可能性がありますが、この決定は通常ハードウェアレベルで行われます。

オーディオストリーミングとの関連性の面ではオーディオ

、それは非常によく、重要である可能性があります。デジタルオーディオのストリームをアナログオーディオ信号に変換する役割を果たすハードウェアは、ストリーム内のビットが特定の順序であることを期待することができる。彼らが間違っていると、音が完全に叩かれることがあります。おそらくあなたの本の作者がこれについて詳しく説明しますか?とにかく、私が前に述べたように、これは通常ハードウェアレベルで決定され、ユーザやカーネルレベルでプログラミングするときは本当に問題になりません。一般に、業界標準は、2つのハードウェアがどのようにデータを相互に伝送するかを定義します。すべてのハードウェアがビットエンディアンに同意している限り、すべてうまくいきます。

Further reading at Wikipedia.

+0

+1シリアル送信順序に言及する。これはC言語には直接関係しませんが、もちろんC言語の多くの用途に関係します。 –

2

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

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

関連する問題