c·c++/c 프로그래밍

빅 엔디언? 리틀 엔디언?

바로이순간 2012. 7. 4. 09:24
빅-엔디안 머신에서 컴파일하고 실행하면 1을 리턴하고 
리틀-엔디안 머신에서는 0을 리턴하는 프로시져 is_big_endian을 작성하라. 
이 프로그램은 사용하는 워드 길이와 관계없이 모든 컴퓨터에서 실행 가능해야 한다.
-----------------------------------------------------------------------------------------------------------------
#include <stdio.h>
int is_big_endian() {
    int x=1;
    char *p=&x;
 
    return 1-(*p);
}
int main() {
    printf("%d",is_big_endian());
    return 0;
}
   
위의 프로그램이 동작하는 이유는 다음과 같습니다.
 
리틀엔디언의 경우에는 가장작은 값이 0번째 바이트에 들어갑니다.
그래서 문자의 포인터에 정수변수의 주소값을 넣으면 문자포인터가 가리키는 한 바이트가
바로 가장작은 바이트이므로 1이 들어 있습니다.
 
따라서 (*p)에 1이 들어 있으므로 1-(*p) 는 0이 됩니다.
 
빅엔디언의 경우에 가장큰 값이 0번째 바이트에 들어갑니다.
그래서 문자포이터가 기리키는 바이트에는 0이 들어 있습니다.
 
따라서 (*p)에 0이 들어 있으므로 1-(*p) 는 1이 됩니다.