1

リトルエンディアンの「種類」であるISAがあります。基本的なメモリ単位はバイトではなく整数です。たとえば

00000000: BEFC03FF 00008000

「低い」整数がBEFC03FF で、「高い」整数が であることを表します00008000。いくつかのビットで表される値を読み取る必要があります。たとえば、ビット 31 から 47 までです。VS10 (c++) で行っていることは、関連するマスクを使用した後に uint64_t var = 0x00008000BEFC03FF を生成し、var & mask. そのようにすることは合法ですか? uint64_t ビットの配置についていくつかの仮定を行います - それは合法ですか? 非常にコンパイラーとすべての OS (ハードウェアに依存しない) で、uint64_t のビットの配置がこのようになると思いますか?

4

1 に答える 1

1

あなたが心配するのは正しいです、それ問題です。

ただし、この特定のケースでは、ISA がリトル エンディアンであるため、つまり AD[31:0] がある場合、整数の最下位ビットはビット 0 にパックされます。プロセッサもリトル エンディアンであると仮定すると、心配する必要はありません。 . データがメモリに書き込まれるとき、正しいバイト順でなければなりません

0000  FF
0001  03
0002  ..

外部バス プロトコルがビッグ エンディアンで、プロセッサがリトル エンディアンであるとします。次に、プロセッサの16ビット整数、たとえば0x1234は0001_0010_0011_0100ネイティブ形式になりますが0010_1100_0100_1000、バス上にあります(16ビットであると仮定)。

この場合、マルチバイト データはエンディアン境界を越えます。ハードウェアは、バイト間のメモリの連続性を維持する必要があるため、 byte 内のビットのみをスワップします。ハードウェアの交換後は次のようになります。

0000 0001_0010
0001 0011_0100

次に、バイト順序を交換するのはソフトウェア次第です

于 2013-02-01T15:09:29.157 に答える