메모리에 데이터를 저장할 때 사용하는 최소 단위는 비트(bit)입니다. 하지만 비트 단위로 데이터를 관리하게 된다면 매우 복잡하고, 불편할 가능성이 높습니다. 그래서 일반적인 연산 장치나 메모리는 바이트(Byte) 단위로 그룹화하여 관리하게 됩니다. 

따라서 데이터를 저장할 때 사용하는 최소 단위는 비트(bit)지만, 프로그램이 처리될 때 사용되는 최소 단위는 바이트(Byte)라고 생각할 수 있습니다.

 

메모리와 같은 1차원 공간에 여러개의 연속된 대상을 배열하는 방법을 '엔디안' 이라고 합니다.

엔디안에는 여러가지 방법이 있을 수 있습니다.

쉽게 우리가 사용하는 언어(한국어)를 기준으로 설명하자면 한국어는 왼쪽에서 오른쪽으로, 위에서 아래로 읽습니다. 하지만 모든 언어가 다 이와같이 읽는것은 아니죠?, 아랍어같은 경우는 오른쪽에서 왼쪽으로, 위에서 아래로 읽는것과 같이 언어의 종류마다 문자를 배열하는 방식을 다를 수 있습니다. 이런 방법들을 모두 '엔디안' 이라고 부릅니다.

 

컴퓨터에 저장되는 데이터는 바로 이 엔디안 방식에 따라 다르게 배열되어 저장됩니다.

위에서 프로그램이 처리될 때 사용되는 최소 단위는 바이트라고 생각할 수 있다고 했습니다. 따라서 프로그램 상에서 데이터를 배열할 때에는 바이트 단위로 배열하며 이를 바이트 순서(Byte Order)라고 합니다.

 

이런 방식에는 일반적으로 빅 엔디안, 리틀 엔디안, 미들 엔디안으로 3가지가 존재합니다. 뭐 다른 방법들도 얼마든지 있겠지만요....

 

빅 엔디안은 큰 단위가 앞에 나오는 방식입니다.

일반적으로 0x12345678과 같은 16진수 정수로 나타내는 방식과 동일합니다. 큰 단위가 앞에 나오기 때문에 프로그램 상에서 사용할 때에도 12345678과 같은 순서로 사용하게 됩니다.

 

리틀 엔디안은 작은 단위가 앞에 나오는 방식입니다.

일반적으로 0x12345678과 같은 16진수 정수로 나타낼 때 바이트 단위로 작은 단위부터 표현하게 됩니다. 포너블을 공부하거나, 문제를 풀 때 GDB상에서 데이터를 입력할 때(인텔 포맷일 경우) 거꾸로 입력하는 방식이 바로 이 방식입니다.

1바이트는 8비트이며, 16진수는 한 자리수가 4비트이기 때문에 바이트 단위로 정렬하게 되면 16진수 두자리씩 묶어서 거꾸로 배열하는 방식입니다. 프로그램 상에서 사용할 때 78563412와 같은 순서로 사용하게 됩니다.

 

미들 엔디안은 빅 엔디안과 리틀 엔디안에 비해서 중요도가 높지 않습니다. 이 게시글에서는 넘어가도록 하겠으며, 나중에 미들 엔디안의 개념이 필요할 때 정리해서 올리도록 하겠습니다.

+ Recent posts