본문 바로가기
네트워크

big endian little endian

by 상레알 2009. 3. 24.

출처 :http://lanil.tistory.com/entry/Little-Big-Endian
다음의 코드의 결과값을 예측해 보세요. 몇 달 전 학과 선배가 면접 봤던 모 회사의 면접 문제였습니다. 아! 인텔 32bit CPU 기준입니다.

정답은 다음과 같습니다. 예측 하셨던 결과값과 동일한가요?

more..

endian 문제에 대해서 따로 생각하지 않으셨다면 아래와 같은 결과를 예측하셨을 수도 있습니다.

1
0
0
0
1

문제에서 32bit 인텔 CPU라는 환경을 명시한 것은 little endian이 문제라는 얘기죠. 차근차근 살펴보도록 하겠습니다.

우선 메모리 구성은 다음과 같습니다. 편의상 0x01번을 시작 번지로 잡았습니다.

union으로 묶여있어서 4바이트의 메모리 공간을 변수들이 공유하고 있는 상황입니다. 이제 x.i = 0; 의 코드를 수행하면 다음과 같이 됩니다.

여기까지는 너무 당연하죠? 그리고 두번째로 x.n[1] = 1; 코드를 수행하면 다음과 같이 구성됩니다.

음? 0x04번지가 아니라 0x03번지에 00000001의 값이ㅣ 기록됐습니다. 여기서 부터 햇갈려 지기 시작하죠. 찬찬히 살펴 보도록 할께요.

우선적으로 배열의 인덱스(x.n[i])를 이용해 접근했기 때문에 실제로 2바이트 뒤쪽의 메모리 공간인 0x03~0x04 번지에 접근하게 됩니다. 그리고 접근된 2Byte의 공간 내에서 little endian이 적용되어 앞쪽 바이트(0x03)에 00000001을 기록하게 되는 것입니다.

4바이트 전체를 사용하는 x.i의 입장에서는 0x04, 0x03, 0x02, 0x01 순으로 값을 재구성 하기 때문에 00000001의 값을 갖고 있던 0x03번지의 값이 실제로는 2번째 바이트의 값으로 해석되어

00000000 00000001 00000000 00000000

의 값을 갖게 돼 10진수로 65536의 값을 나타내게 됩니다.

또 반면에 배열의 인덱스를 이용해 직접 메모리 주소에 접근하는 x.c[0] ~ x.c[3]의 경우 메모리에 기록된 순서대로 값을 읽어

0 0 1 0(10진수 값)

의 값을 갖게 되죠.

p.s. 취업안되서 쓰다 만 포스팅. ㅠㅠ