原始c ++内存逻辑的奇怪行为

Ale*_*kij 0 c++ memory stm32 iar

在带有stm32(arm cortex)CPU的IAR IDE中,我在原始情况下有非常奇怪的行为.

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!
Run Code Online (Sandbox Code Playgroud)

(请参阅我期望的评论,以及会发生什么.)为什么我得到这个结果?我没有解释.

Wol*_*olf 9

这只是字节序的平台,混淆你:你期待大端模式,你是通过观察调试器是小尾数.

本文可能有所帮助:Endianness - 维基百科,免费的百科全书