2016-07-18 26 views
0

In IAR IDE mit stm32 (Arm Cortex) CPU Ich habe sehr seltsames Verhalten in einer primitiven Situation.seltsames Verhalten der primitiven C++ Speicherlogik

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! 

(Siehe Anmerkungen für das, was ich erwarte, und was passiert.) Warum bin ich dieses Ergebnis zu bekommen? Ich habe keine Erklärungen.

+14

Lesen Sie mehr über [* endianness *] (https://en.wikipedia.org/wiki/Endianness). –

+0

Erhalten Sie jedes Mal das gleiche Ergebnis? –

+1

Schreiben Sie immer Code auf eine Weise, die egal ist, was der Endian ist. z.B. wie du es für "res1" getan hast. Der res2-Code hängt davon ab, wie die 32-Bit-Zahl in den 4 Bytes des Speichers verteilt ist, was vom C-Standard nicht garantiert wird. Das erste Beispiel (res1) stützt sich nur darauf, was die Daten darstellen, nicht darauf, wo es ist. (Ich habe sogar Prozessoren gesehen, die unterschiedliche Layouts haben: Big-Little-Endian und Little-Big-Endian). –

Antwort