Search Results for 'endian'


1 POSTS

  1. 2009/02/22 Endian의 고려 by 슴갈 (4)

Endian의 고려

자신이 영원히 MS Windows에서 코드를 만든다면 endian은 전혀 신경 쓰지 않아도 된다. 하지만 그렇게 만든 코드는 항상 little endian 전용이라는 꼬리표가 붙어 다녀야 제대로 된 것이다.

코드

unsigned long aaa   = 0x01FF0002;
unsigned char* pCh  = (unsigned char*)&aaa;
unsigned short* pWd = (unsigned short*)(pCh+1);
printf("+++++ %x, %x\n", *pCh, *pWd);

위의 코드는 endian이 전혀 고려되지 않은 코드이므로 일반적인 목적에서는 잘 못 만들어진 코드이다. 그래서 그 결과를 실제로 돌려보면 다음과 같다.

Little endian의 결과

+++++ 2, ff00

Big endian의 결과

+++++ 1, 00ff

Little endian의 결과 (ARM 컴파일러)

+++++ 2, 3d8f

Little endian과 big endian의 결과는 예상한 대로 서로 다르게 나타났다. 원래 메모리의 구조가 그런 것이니 이렇게 나오는 것이 맞다. 그렇기 때문에 위의 코드처럼 프로그램을 만들면 그 코드는 특정 endian에만 적용되는 코드가 되는 것이다.

그리고 여기서 말하고자 하는 것은 이것말고 또 하나가 있다. 제일 마지막에 나온 ARM 컴파일러의 little endian의 결과이다. 같은 little endian이라도 해도 chip-set이나 컴파일러가 달라지면 그 결과가 달라진다는 것을 말하기 위해서 마지막의 결과도 하나 추가했다.

ARM의 경우에는 3d8f라는 전혀 엉뚱한 값이 나타났는데 이 값은 그 결과를 예상할 수 없는 값이며 항상 바뀔 수 있다. 이런데 이 결과는 문제가 없다. 왜냐면 ARM 컴파일러의 매뉴얼에서는 이 문제에 대해서 확실히 언급을 하고 있기 때문이다. (각 자료형에 대한 align 문제이며 이것은 ARM의 동작과 관련된 문제이다) 그래서 비록 자신이 사용하는 컴파일러가 ARM용이 아니라고 해도 범용적인 코딩을 한다고 생각한다면 이런 것까지 다 고려해야 한다.

그래서 결론을 이야기 하자면, endian을 항상 고려해서 코딩을 해야 하며 모든 칩에서 호환이 가능한 문법으로 접근하자는 것이다.

Posted by 슴갈

2009/02/22 23:53 2009/02/22 23:53
Response
No Trackback , 4 Comments
RSS :
http://avej.com/textcube/rss/response/8

Trackback URL : http://avej.com/textcube/trackback/8

Comments List

  1. Mahavishnu 2009/03/06 18:01 # M/D Reply Permalink

    엔디안 문제에 대한 정답이 알고싶습니다.
    저도 범용 코딩 스타일을 지향하는지라 . .
    저런 경우에는 어떤 방식으로 구현하는 것이 좋은지요?

    1. 슴갈 2009/03/15 10:30 # M/D Permalink

      엔디안 문제의 정답은 '항상 원래 정의한 type만 사용하며, 그 type의 각각의 바이트를 제어하기 위해서는 shift와 masking을 이용한다'로 정의하면 되지 않을까 생각합니다. 위의 예의 경우에도 원래의 type인 unsigned long에서 masking으로 값을 뽑아야 하고요.

      단, 파일에 저장되는 경우에는 파일 포맷에 사용한 엔디안을 명시해야겠지요.

      little endian 명시 예: BMP 파일 등
      big endian 명시 예: PNG 파일 등
      둘 다 가능하지만 헤더에 명시: JPEG의 EXIF 등

  2. 유객주 2011/01/23 19:55 # M/D Reply Permalink

    big endian 결과가 +++++ 1, 00ff
    로 나왔는데,

    제 생각에는

    +++++ 1, ff00 이어야 할 것 같은데요.

    왜냐하면 big endian일 때 메모리 순서상 01FF0002로 저장되고 ff00 두 바이트를 big endian으로 읽으면 그 순서대로이므로, ff00로 나오지 않을까요?

    1. 슴갈 2011/01/30 15:21 # M/D Permalink

      예, 맞습니다. 0xFF00이네요. (글 쓸 때 big endian은 해당 타겟이 없어서 직접 안 돌려 보고 little endian 결과를 꺼꾸로 했더니... -_-;; )

Leave a comment
[로그인][오픈아이디란?]

블로그 이미지

GP2X WIZ와 CAANNO와 bada용 게임 개발을 하자

- 슴갈

Notices

Archives

Authors

  1. 슴갈

Recent Trackbacks

Calendar

«   2012/02   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Site Stats

Total hits:
36068
Today:
17
Yesterday:
44