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.
Lesen Sie mehr über [* endianness *] (https://en.wikipedia.org/wiki/Endianness). –
Erhalten Sie jedes Mal das gleiche Ergebnis? –
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). –