2011-02-10 8 views
2

プログラムはビッグエンディアンかリトルエンディアンかを決定することです。質問からケアマップアップについてendian

これは本の中で与えられた答えです:

int Test(){ 
    short int word = 0x0001; 
    char *byte = (char *) &word; 
    return (byte[0] ? BIG:LITTLE); 
} 

私はこの行を理解していない:char *byte = (char *) &word;それが「バイトにワードのアドレスを渡す」ということですか?だから、バイトポイントからワードの元のアドレス?私が知っているように、short intは2バイトです。だから、 "バイト"は、より高いアドレスまたはより低いアドレスを指していますか?どうして?

これはどのように機能しますか?

+0

_does「バイト」ポイントリトルエンディアンマシンです_?それはTest関数が決定するものです。マシンによっては高く、他のマシンでは低くなります。 –

答えて

3

アドレスはwordで、これをcharポインタにキャストしてbyteに入れるだけです。その時点で

byteは2バイト wordの最初のバイト、およびそのバイトの値を指します(1または0)あなたはビッグまたはリトルエンディアンのマシンにしているかどうかを教えてくれます。

+0

あなたが言ったように、 "2バイトワードの最初のバイト"は、より高いアドレスの1つまたはより低いアドレスのアドレスを意味しますか? –

+1

これは、BIGエンディアンマシン上で最上位バイト(0)になり、LITTLEエンディアンマシンで最下位バイト(1)になる「下位」アドレスを指します。 – payne

3

我々は短いが2バイトであると仮定した場合、メモリレイアウトは、ビッグエンディアンのマシン上で次のようになります。

 
MSB  LSB 
------------------- 
| 0x0 | 0x1 | 
------------------- 

そして、このようなリトルエンディアンのマシン上

 
MSB  LSB 
------------------- 
| 0x1 | 0x0 | 
------------------- 

すなわち、短い0x0001は2バイトで構成され、1つは値0、もう1つは値1となります。ビッグエンディアンのマシンでは、最も重要でないバイト(ここでは0x1)がそのショートの下位メモリアドレスに格納され、上位アドレスに格納されます。リトルエンディアンのマシンでは、それは逆です。

したがって、char *byte = (char *) &word;は、アドレスwordを取得し、それをchar *として解釈します。 charが8ビットであると仮定すると、short内の最下位バイトへのポインタを持つようになりました。これが0x1の場合、マシンは上記の図のようにビッグエンディアンです。それが0なら、それはリトルエンディアンマシンです。

(エンディアンをチェックするこの方法は、ポータブルではないかもしれないことに注意してください - charが短いと同じサイズ、およびこの方法には、他の多くの多かれ少なかれ難解な落とし穴です例えばそこ機)

0

あなたが欲しいです1バイトのステップで単語を読む。 これで、一度に1バイトずつ見える単語へのポインタを取得します。 charは標準定義で1バイトなので、これはchar *です。 次に、char *をwordが割り当てられたメモリの場所に向け、最初の値(byte [0]、それを逆参照するために* byteも使用できます)を読み込みます。 それが1であれば、それはビッグエンディアンマシンです:

01 00 

それがゼロであれば、それは上位アドレスまたは下位アドレスに

00 01