티스토리 뷰

development

Endian 이란 무엇일까?

fistful 2021. 2. 3. 16:44
반응형

Photo by 青 晨 on Unsplash

 

 

컴퓨터 공부를 하다보면 엔디언(Endian)이라는 개념이 나온다. 엔디언, 리틀 엔디언

 

어원은 걸리버 여행기에 나오는 소인국들의 싸움의 원인인 달걀을 어느쪽으로 깨먹는가 하는 논쟁이다.

달걀의 뾰족한 부분이 아닌 상대적으로 넙적한 부분을 Big-end 라고 부른 것에서 나온 것이다.

 

그렇다면 컴퓨터에서 이야기하는 엔디언, 리틀 엔디언은 무슨 의미일까?

 

1바이트가 넘는 타입을 메모리에 저장하는 방법

integer 4바이트 타입이 있고 타입의 값을 메모리에 저장한다고 생각해보자.

값을 16진수로 0x12345678 이라고 하자

 

컴퓨터 메모리는 바이트마다 주소값을 가진다. 4바이트를 저장해야 하니 4개의 메모리 주소에 각각 바이트씩 저장할 것이다.

메모리의 주소가 1, 2, 3, 4라고 때에 엔디언에 따라 어떻게 저장될까?

 

엔디언

주소

1번지

2번지

3번지

4번지

0x12

0x34

0x56

0x78

 

리틀 엔디언

주소

1번지

2번지

3번지

4번지

0x78

0x56

0x34

0x12

 

아래 그림이 이해하기 더욱 좋겠다.

출처는 위키: https://www.wikiwand.com/en/Endianness

 

어떤 기준으로 엔디언이 결정될까?

엔디엔은 System architecture 관련이 있다. 쉽게 이야기하면 CPU 어디껀지에 관련이 있다.

출처: https://stackoverflow.com/questions/9237317/what-makes-a-system-little-endian-or-big-endian

 

Endian-ness is determined by the hardware, not the OS. So whatever (native) VM you install on it,

will be the same endian as the host. (since x86 is all little-endian)

 

다만 네트워크에서는 엔디언으로 통일해서 쓴다. 여러 시스템간의 통신시에 혼선을 없애준다.

 

어떤 엔디언이 좋을까?

 

오늘날 차이는 없지만 미묘한 장단점은 있다.

- 엔디언은 사람이 읽기 좋기에 디버깅에 좋다.

- 리틀 엔디언은 하위 바이트에 주소값으로 바로 접근할 있는 점이 좋다. 변수의 바이트 주소가 바로 변수의 주소인 특성 때문이다.

 

엔디언을 확인하는 Go 코드

 

간단히 현재 Go 코드가 돌아가는 시스템의 아키텍처와 엔디언을 확인하는 프로그램을 짜보았다.

테스트 코드: https://play.golang.org/p/j3bF2Vt_lcC

참고 결과

결국 Architecture 모두 amd64 라서 리틀 엔디언이다.

Windows 10

OS: windows, Architecture: amd64

Little Endian: the first byte of int16 type 0x8811 is 0x11

WSL2 (in Windows 10)

OS: linux, Architecture: amd64

Little Endian: the first byte of int16 type 0x8811 is 0x11

PlayGround

OS: linux, Architecture: amd64
Little Endian: the first byte of int16 type 0x8811 is 0x11

 

참고: 주요 아키텍처/OS 에서의 엔디언 정보: https://geraldonit.com/2017/09/04/big-and-little-endian-operating-systems/)

반응형
댓글
댓글쓰기 폼