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!
(내가 기대에 대한 주석을 참조하고, 어떤 일이. 일이) 가 왜이 결과는 무엇입니까? 나는 아무런 설명이 없다.
읽기에 대해 [* 엔디안 *] (https://en.wikipedia.org/wiki/Endianness). –
매번 동일한 결과가 나타 납니까? –
엔디안에 상관없이 항상 작동하는 방식으로 코드를 작성하십시오. 예 : 'res1'에서했던 것처럼. res2 코드는 32 비트 숫자가 4 바이트 메모리에 어떻게 분산되어 있는지에 의존하며, 이는 C 표준에 의해 보장되지 않습니다. 첫 번째 예제 (res1)는 데이터가 나타내는 위치에만 의존합니다. (나는 다른 레이아웃을 가진 프로세서도 보았습니다 : 빅 리틀 엔디안과 리틀 빅 엔디안). –