컴퓨터는 숫자를 저장할때 두 가지 방식을 사용한다.

하나는 Little Endian 방식으로 바이트를 거꾸로 넣어서 저장하고

또 하나는 Big Endian 방식으로 바이트 순서데로 저장한다. 무선말이고 하니

0x01234567 이라는 숫자를 저장한다면 컴퓨터는 이를 특정 주소에 저장하게 되는데 그림으로 표현하면 아래와 같다.


리틀 엔디안(Little Endian) 기준으로 설명하자면

0x01234567 이라는 숫자에 맨 앞에 젤 큰 자리수 "01"이 높은주소에

젤 낮은 자리수 "67"이 낮은 주소에 저장되어있다.

그래서 High Hight Low Low로 외우면 편하다.

빅엔디안(BigEndian)은 그 반대다.

리틀 엔디안(Little Endian)방식을 사용하는 모델은 Intell 기종으로 x86 시리즈로 말할수있고

빅엔디안(Big Endain) 방식은 ARM 계열이 사용하며 추가로 네트워크  바이트 오더에서도 사용된다.

c언어로 코딩해서 확인해보자.

  1. #include <stdio.h>
  2.  
  3. int is_little_endian()
  4. {
  5.  int a = 0x01234567;
  6.  
  7.  printf("%x %x\n",((char*)&a),*((char*)&a));
  8.  printf("%x %x\n",((char*)&a+1),*((char*)&a+1));
  9.  printf("%x %x\n",((char*)&a+2),*((char*)&a+2));
  10.  printf("%x %x\n",((char*)&a+3),*((char*)&a+3));
  11.  
  12.  if ( *((char*)&a) == 0x67 )
  13.  {
  14.   return 1; // little endian
  15.  }
  16.  
  17.  return 0; //big endian
  18.  
  19. }
  20.  
  21. void main()
  22. {
  23.  
  24.  int res= is_little_endian();
  25.  if ( res == 1 )
  26.  {
  27.   printf("little endian system\n");
  28.  }
  29.  else
  30.   printf("big endian system\n");
  31.  
  32. }


Posted by 캐스피

댓글을 달아 주세요

  1. camel 2016.04.08 20:49  댓글주소  수정/삭제  댓글쓰기

    if ( *((char*)&a) == 0x67) 이 의미하는 바는 뭔지 설명 해 주실수 있으신가요?
    그리고 왜 == 값을 0x67로 잡은신거죠?
    little endian 같은 경우는 제일 앞에 값이 제일 높은 위치에 저장이 되니 == 0x67로 잡을 경우 0x1234567 의 제일 밑에 비트열 0x67과 and 연산을 하는 건가요?

    저도 비슷한 코딩을 할려고 하는 중인데 c가 오랜만이라 애를 먹는중이라 조언좀 부탁드리겠습니다.

    • 캐스피 2016.04.11 12:10 신고  댓글주소  수정/삭제

      메모리에 변수 a가 0x01234567 값이 저장될경우

      리틀 엔디안일경우 High high low low라고

      높은 주소에는 높은자리수가 , 낮은 주소에는 낮은 자리수가 잡히게 됩니다.

      0x12 같은경우는 제일 높은 자리수 이므로, &a+3의 위치에 있게되고
      반대로 0x67같은 경우에는 가장 낮은 자리수이므로, 낮은 주소 &a에 저장되어있는것입니당..

      &a = 0x67
      &a+1 = 0x45
      &a+2 = 0x23
      &a+3 = 0x01

      순으로 저장되니깐여

      &a가 100일경우 100,101,102,103의 주소라고 보시면됩니다

      그래서 &a의 주소에 0x67이 저장되어있다면(==) little endian으로 판별할수있는것이에여ㅛ

      그리고 and 연산이 아니라 & (주소값)입니다

  2. camel 2016.04.18 20:54  댓글주소  수정/삭제  댓글쓰기

    감사합니다. 많은 도움이 됐습니다.
    블로그에 너무 좋은 내용이 많네요. 참고 하겠습니다. ^^

  3. 로봇매냐 2017.10.24 14:49  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다. 엔디안 헷갈리는데 간결하게 잘 설명해주셨네요 ^^

  4. 행인 2018.10.19 17:10  댓글주소  수정/삭제  댓글쓰기

    AMD 이 아니라..ARM...