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
0 Trackbacks , 4 Comments
RSS :
http://smgal.ismine.net/tc_191/blog1/rss/response/8

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

« Previous : 1 : ... 39 : 40 : 41 : 42 : 43 : 44 : 45 : 46 : 47 : ... 50 : Next »

블로그 이미지

게임 개발을 기반으로 한, 잡다한 개발 기록 저장소

- 안영기

Notices

Archives

Authors

  1. 안영기

Recent Comments

Recent Trackbacks

Calendar

«   2024/03   »
          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 30
31            

Site Stats

Total hits:
235091
Today:
29
Yesterday:
10