2016-07-18 8 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

읽기에 대해 [* 엔디안 *] (https://en.wikipedia.org/wiki/Endianness). –

+0

매번 동일한 결과가 나타 납니까? –

+1

엔디안에 상관없이 항상 작동하는 방식으로 코드를 작성하십시오. 예 : 'res1'에서했던 것처럼. res2 코드는 32 비트 숫자가 4 바이트 메모리에 어떻게 분산되어 있는지에 의존하며, 이는 C 표준에 의해 보장되지 않습니다. 첫 번째 예제 (res1)는 데이터가 나타내는 위치에만 의존합니다. (나는 다른 레이아웃을 가진 프로세서도 보았습니다 : 빅 리틀 엔디안과 리틀 빅 엔디안). –

답변

9

그것은 당신을 혼란 플랫폼의 단지 엔디 언입니다 : 당신은 빅 엔디안 모델을 기대하고, 당신이 디버거를 통해 관찰하는 것은 리틀 엔디안입니다.

이 문서가 도움이 될 수 Endianness - Wikipedia, the free encyclopedia