2016-07-18 9 views
0

stm32(腕皮質)CPUを搭載したIAR IDEでは、プリミティブな状況では非常に奇妙な動作をします。プリミティブC++メモリロジックの奇妙な動作

uint32_t s = 6654; //=0x000019FE 
//next I'll see in IAR debugger 

uint8_t res1 = 0; 
res1 = (s&0xFF000000)>>24; //see in debugger: res1=00 
res1 = (s&0x00FF0000)>>16; //res1=00 
res1 = (s&0x0000FF00)>>8; //res1=19 
res1 = (s&0x000000FF);  //res1=FE 

void *sp = &s; 
uint8_t res2 = 0; 
res2 = *((uint8_t*)sp+0); //res2=FE   but must be 00! 
res2 = *((uint8_t*)sp+1); //res2=19   but must be 00! 
res2 = *((uint8_t*)sp+2); //res2=00   but must be 19! 
res2 = *((uint8_t*)sp+3); //res2=00   but must be FE! 

(私は期待のコメントを参照してください、そして何が起こる。) なぜ私はこの結果を取得していますか?私は説明がありません。

+14

読み取りを。 –

+0

毎回同じ結果が得られますか? –

+1

エンディアンに関係なく常に動作する方法でコードを記述してください。例えばあなたが 'res1'のためにしたのと同じように。 res2コードは、32ビット数が4バイトのメモリにどのように分配されるかに依存しますが、これはC標準では保証されていません。最初の例(res1)は、データが表す場所だけではなく、データが表すものに依存します。 (私は、レイアウトが異なるプロセッサ、ビッグリトルエンディアン、リトルビッグエンディアンも見てきました)。 –

答えて

9

それはあなたを混乱させる、お使いのプラットフォームのちょうどエンディアンです:あなたはビッグエンディアンモデル、どのようなデバッガを経由して観察されていることであるリトルエンディアンを期待しています。

この記事は助けることがあります。[*エンディアン*](https://en.wikipedia.org/wiki/Endianness)についてEndianness - Wikipedia, the free encyclopedia