2017-07-20 6 views
1

これは重複していると確信しているが質問する必要がある種類の質問です。私は用語を知らないので、何を検索するのかわからない、私はただの例に基づいて正しい用語を求めているだけだ。これらのポインタの間接参照の相違点

誰かがこれらの2間(だけでなく、だけでも、正しい用語と私は違いを自分のgoogleことができます)私の違いを説明することができます:

UINT32 v32; 
UINT32* v32_ptr = &v32; 

UINT16 v16_1 = *(UINT16*)v32_ptr; // Version 1 of dereferencement 
UINT16 v16_2 = (UINT16)*v32_ptr; // Version 2 of dereferencement 

結果は同じですが、どのようなユースケースについては?

+1

これは、コンピュータベースのWebサイトではなく、人に基づくQ/A Webサイトを持つ利点です。あなたは例で質問することができます;) –

+0

誰かがDVを説明できますか?私は本当に私がより良い質問をする方法を知りたいと思っています – infotic

答えて

2

最初のケースでは、32ビットポインタを16ビットポインタにキャストして逆参照しています。 2番目のケースでは、32ビットポインタの逆参照が行われます。

どちらの場合も、16ビット変数に割り当てられています。

結果は常に同じではなく、アーキテクチャのエンディアンに依存します。言い換えれば、アーキテクチャがリトルエンディアンである場合、2つの16ビット変数は、ソースが取ることができる値の全範囲にわたって等しい必要があります。しかし、アーキテクチャがビッグエンディアンの場合、値は異なる場合があります。

EDIT 下記のコメントであなたの質問に照らして、私はここで参考になると思いました。

次のことを考慮し、アーキテクチャがどのエンディアンが好きなのかを選ぶことができます。また、値0x4241を使用して、プロセスをbig/little-endianを4回交互に書き出してみましょう。最初の2回はUINT32、最後の2回はUINT16です。

address  data 
0xABCD0000 00 00 42 41 // big-endian, UINT32, value 0x4242 
0xABCD0004 41 42 00 00 // little-endian 
0xABCD0008 42 41  // big-endian UINT16 
0xABCD000A 41 42  // little-endian UINT16 

最後の2つは、違いを視覚化するのに役立ちます。

v32_ptrにv32のアドレスを設定すると、メモリアドレス0xABCD0000(たとえば)が返されます。値はメモリ内に配置されます。 v32_ptrを(UINT16 *)にキャストすると、メモリアドレスは変更されませんが、最初の2バイトだけが使用されます。そのポインタを16ビットポインタとして参照解除すると0が返されますが、32ビットptrとして参照解除すると結果は0x4241になります。

リトルエンディアン変数でも同じことを実行します。ここでは、メモリアドレスは0xABCD0004と0xABCD000Aです。 v32_ptrを0xABCD0004に設定し、それを(UINT16 *)(LE)として逆参照すると、値0x4241が得られます。これは16bit-LEポインタを逆参照した場合(アドレス0xABCD000Aなど)と同じ値になります。

両方のキャストは32ビットの元の値を切り捨てますが、今度はその違いを見ることができれば幸いです。

最後

この情報は、ネットワークプログラミング、組み込みシステム、およびピア・ツー・ピアおよびクライアント・サーバ・プロトコルでのアプリケーションを持っています。リトルエンディアンはほぼ普遍的ですが、BEシステムはまだあります。また、いくつかの古いネットワークプロトコルでは、BEを使用することを明示的に選択しました。そして、あなたの例の特定のアプリケーションは、あなたが実行しているシステムのエンディアンを(移植可能なソースコードのために)テストすることです。すなわち、v32 = 0x4241を設定し、両方の方法を間接参照した後、v16_1とv16_2が同じ場合(両方とも0x4241に等しい)、システムはLEですが、それらが異なる場合(0x4241が得られ、もう一方が0です)システムはBEです。

+0

また、ポインタ演算が行われている場合、結果はさらに異なる場合があります –

+0

ありがとうございます、それは今より明らかです。しかし、キャスティングなしではどうだった? '*(UINT32 *)v32_ptr'と'(UINT32)* v32_ptr'の違いは何ですか? – infotic

関連する問題