Objective-C는 무슨 Endian인가?!

시작하며..

개인적으로 Bit Manipulation에 대해 공부를 하다가 궁금한 부분이여서 얇은 구글링을 통해 Endian에 대해 알아보게 되었는데, 스스로는 잊어 버리지 않기위해 남김이며, 더 나아가 혹시 궁금해서 검색하는 분들에게도 도움이 되지 않을까 하는 약간의 기대감을 갖고 글을 적어 본다.

Endian이란 무엇인가?

현재 컴퓨터 설계 측면에서 보면 Big-Endian을 사용하는 컴퓨터가 있고, Little-Endian을 사용하는 컴퓨터가 있다. Unix와 Linux 프로세서에서는 Big-Endian을 사용하고 있고, Inter x32, x64 계열에서 Little-Endian을 사용하고 있다고 한다. 그렇다면 여기에서 말하는 Endian은 과연 무엇인가?

Endian은 메모리에 byte를 읽고 쓰는 순서에 대한 방식을 말한다. 32 bit 컴퓨터는 4 byte 단위로 메모리에 데이터를 읽고 쓰는 동작을 하는데, 이때 높은 byte 부터 쓰느냐 혹은 낮은 것 부터 쓰느냐 여부는 자신의 컴퓨터 CPU 설계 방식에 따라 달라지게 된다. 예를 들면, 빅 엔디안 컴퓨터에서는 16진수 “4F52″를 저장공간에 “4F52″라고 저장할 것이다 (만약 4F가 1000번지에 저장되었다면, 52는 1001번지에 저장될 것이다). 반면에, 리틀 엔디안 시스템에서 이것은 “524F”와 같이 저장될 것이다.(출처)

왜 중요한가?

그렇다면 왜 이렇게 byte를 쓰는 순서가 중요한 것일까? 그 이유는 서로 다른 컴퓨터가 채택한 Endian이 다르기 때문이다. 만약 혼자 프로그램을 짜고 자신의 컴터에서만 사용한다면 큰 문제가 없겠지만, 네트워크 통신을 해서 보낸 데이터의 Endian 방식과 받는 컴퓨터의 Endian 방식이 상이 하다면 뜻하지 않은 결과가 나오기 때문이다. 그렇기 때문에 사용하게 될 프로토콜에서 정의하는 Endian이 무엇인지 확인한 후 프로그래밍을 해야 하며, 때에 따라 Little-Endian을 Big-Endian으로 변경하는 코드를 넣어야 할 것이다.

증명 코드

그렇다면 iOS 개발자로써 궁금해지는 것이 있다. Objective-C은 과연 어떤 Endian을 기본적으로 사용하고 있는지 궁금할 것이다. 답을 먼저 말한다면 당연히 ‘Little-Endian’이다. 개인적인 생각은 Intel CPU를 사용하고 있으니 당연히 그럴 것이라고 생각을 했지만, 이를 증명하기 위한 코드를 간단히 짜보면 안다.

  1. #include
  2.  
  3. int main() {
  4.     long x = 0×44434241;//"DCBA"
  5.     char *y = (char *) &x;
  6.  
  7.     if(strncmp(y,"ABCD",4)){
  8.         printf("Big Endian\n");
  9.     }else{
  10.         printf("little Endian\n");
  11.     }
  12. }

StackOver Flow에서 발취함.
코드는 strncmp 함수를 사용하여 “DCBA” 문자열과 “ABCD”문자열을 비교하는 간단한 실험이다. 만약 Big-Endian로 저장이 된 것이라면 x 변수가 저장 될때 0×44, 0×43, 0×42, 0×41 순서되로 저장 될 것이다. (0×41는 “A”이다.) 하지만 Little-Endian으로 저장이 된다면 이 순서가 반대로 저장이 될 것이다. 코드를 돌려보면 알겠지만 console창에는 ‘little Endian’이 찍힌다.

마치며…

실 프로그래밍 생활에서 기본이 되기에 살포시(?!) 무시하고 지나갈 수 있는 내용이지만 remind하는 차원에서 읽었으면 좋겠다. 그래도 이해가 안간다면 링크에 자세한 설명이 나와 있으니 한번 읽어보면 쉽게 이해가 갈것이라 생각되어 진다.