바이트 오더링(Byte Ordering)은 컴퓨터에서 메모레이 데이터를 저장하는 방식을 의미한다.

바이트 오더링은 크게 두종류로 나뉘는데 리틀 엔디언(Little Endian), 빅 엔디언(Big Endian)으로 구분 할 수 있다.


간단하게 쉽게 설명부터 하자면, 빅 엔디언 방식은 데이터를 입력한 순서대로 저장합니다. 주로 대형 UNIX 서버에서 사용되는 RISC(*1)(Reduced Instruction Set Computer) CPU 또는 네트워크 프로토콜에 사용 합니다.

빅 엔디언의 장점은 데이터를 순서대로 저장하기 때문에 직관적이라는 점입니다. 뒤에서 다시 설명하겠지만 빅 엔디언과 리틀 엔디언의 가장 큰 차이점은 일부 자료형에 따른 저장방식이 다르다는 점입니다.

빅 엔디언의 경우 전 자료형에 대해 입력한 순서대로 저장하지만, 리틀 엔디언의 경우는 WORD형과 DWORD 자료형에 대해서는 입력한 순서와 반대로 저장합니다.

아래의 예를 들어 빅 엔디언을 설명하겠습니다.

- 코드(1.1)

BYTE b = 0x12;

WORD w  = 0x1234;

DWORD dw = 0x12345678;

char str[] = "abcde"; 

- 빅 엔디언 표기(표 1.1)

 Type

Name

Size 

빅 엔디언 표기

BYTE

b

1

 [12]

WORD

w

2

[12][34] 

DWORD

dw

4

[12][34][56][78]

char[]

str

6

[61][62][63][64][65][00]

표 1.1에서 보는것과 같이 빅 엔디언은 값을 입력한 대로 저장한다. 마지막 char형의 경우 마지막에는 NULL값이 들어가기 때문에 [00]이 포함된다. 

그럼 동일한 값을 리틀 엔디언 표기법으로 저장하면 어떻게 될까?


-리틀 엔디언 표기(표 1.2)

 Type

Name

Size 

리틀 엔디언 표기 

BYTE

[12]

WORD

[34][12] 

DWORD 

dw 

[78][56][34][12]

char[] 

str 

[61][62][63][64][65][00] 

표 1.2에서 보는것과 같이 리틀 엔디언은 WORD형과 DWORD형에서는 입력된 순서와 반대로 값을 저장한다.


리틀 엔디언 방식의 경우 바이트 자체는 입력한 순서대로 저장이 되지만, WORD나 DWORD처럼 멀티 바이트(Multi-BYTE)의 경우에는 각 바이트가 역순으로 저장이 된다. 빅 엔디언이 직관적인 면에서 더 우월하기 때문에 소프트웨어 디버그가 편한 반면, 리틀 엔디언 방식은 산술 연산 및 데이터 타입의 확장/축소 시 더 편한 장점을 가지고 있다.

표 1.2를 보면, 문자열은 빅 엔디언과 동일한 방식으로 저장이 됨을 볼 수 있는데 이는 문자열은 결국 char 배열이기 때문에 각 바이트를 하나씩 연속해서 저장하기 때문에, 리틀 엔디언도 문자열 자체는 빅 엔디언과 동일하게 저장한다고 보면 된다.


*1) RISC : Reduced Instruction Set Computer의 약자로 말 그대로 풀어쓰면 '명령어 세트 컴퓨터' 라고 한다. 기존 CICS(*2)에 존재하는 수많은 명령어와 주소모드 중 실제 사용되는 명령어는 몇개 되지 않는다는 사실을 바탕으로 적은 수의 명령어만으로 명령어 집합을 구성한 방식이다. 

*2) CICS : Complex Instruction Set Computer의 약자로 복잡한 명령어 집합을 갖는 CPU 아키텍처. 주로 메인프레임이나 X86 호환 프로세에서 이 방식을 사용하고 있다.

Posted by Latte_
,