#include <stdio.h>

int main(){

// 변수선언부

int i = 0x00000001, j, cnt=0; // 리틀, 빅엔디언을 구별하기 위해 쓸 변수i

int Endian = 0x12345678, Exchange; // 다른 Endian방식으로 바꿀 변수 Endian

// 변수에 저장된 Endian의 원래 hex 값 출력

printf("Original = %x\n", Endian);

// 변수 i는 int형 4byte 배열로 나타낼 수 있다 ->  ((char*) &i) [0]

// Little Endian이라면 01 00 00 00 이런식으로 저장되기 때문에

// i의 01 값이 배열 첫번째 인덱스[0]에 저장되어있다면 아래 if연산은 true가 된다.

if(((char *) &i)[0]){

// Little Endian

printf("This system use Little Endian!\n\n");

// Endian을 메모리에 저장된 순서대로 출력한다.

printf("변수 Endian은 메모리에 Little Endian으로 저장됨 : ");

for (j = 0; j < sizeof(int); j++)

printf("%x ",((char *) & Endian)[j]);

// 메모리에 저장된 반대 순서대로(Big Endian) Exchange에 저장

printf("\nBig Endian 방식으로 바꾸어 메모리에 저장함  : ");

for (j = sizeof(int) - 1; j >= 0; j--){

((char *) & Exchange)[cnt++] = ((char *) & Endian)[j];

}

// Big Endian으로 바꾼 Exchange를 메모리에 저장된 순서대로 출력한다.

for (j = 0; j < sizeof(int); j++){

printf("%x ",((char *) & Exchange)[j]);

}

printf("\n");

}

else{

// Big Endian

printf("This system use Big Endian!\n\n");

// Endian을 메모리에 저장된 순서대로 출력한다.

printf("변수 Endian은 메모리에 Big Endian으로 저장됨 : ");

for (j = 0; j < sizeof(int); j++)

printf("%x ",((char *) & Endian)[j]);

// 메모리에 저장된 반대 순서대로(Little Endian) Exchange에 저장

printf("\nLittle Endian 방식으로 바꾸어 메모리에 저장함  : ");

for (j = sizeof(int) - 1; j >= 0; j--){

((char *) & Exchange)[cnt++] = ((char *) & Endian)[j];

}

// Little Endian으로 바꾼 Exchange를 메모리에 저장된 순서대로 출력한다.

for (j = 0; j < sizeof(int); j++){

printf("%x ",((char *) & Exchange)[j]);

}

printf("\n");

}

}