Programming/Web

빅 엔디언과 리틀 엔디언(Big Endian & Little Endian)

Jan92 2022. 11. 5. 16:53
반응형

빅 엔디언과 리틀 엔디언(Big Endian, Little Endian)

빅 엔디언과 리틀 엔디언이라는 생소한 개념을 접하며 정리한 내용입니다.

엔디언에 대해서 살펴보기 전에 비트와 바이트에 대한 내용부터 시작하여 살펴보도록 하겠습니다.

 

 

1. 비트와 바이트(데이터가 저장되는 방식)

비트(binary digit, bit) / 바이트(byte)

눈에 보이지는 않지만 내부적으로 컴퓨터가 동작하는 원리는 비트(bit)라고 하는 '0'과 '1'로 표현되는 단위부터 시작됩니다.

비트는 컴퓨터가 데이터를 처리하기 위해 사용하는 데이터의 최소 단위로, 하나의 비트만으로는 많은 양의 데이터를 나타내기 부족하기 때문에 8개의 비트(bit)를 묶은 바이트(byte)라는 단위가 메모리에 저장되는 최소 단위로 정해졌습니다.

(메모리 1칸은 1byte로 구성되어 있지만 실제 저장되는 데이터는 대부분 4byte 또는 8byte 크기로 구성됩니다.)

 

하나의 바이트는 256 종류의 정보를 나타낼 수 있는데요. 이는 1개의 바이트가 8개의 비트로 이뤄져 있고, 비트 하나는 '0'과 '1'이라는 두 가지 값으로 표현될 수 있기 때문에 2의 8승으로 계산되는 것입니다.

(1byte는 한 개의 영문자를 표현할 수 있으며, 한글과 같은 문자를 표현하기 위해서는 한 문자당 2byte가 필요합니다.)

 

 

 

2. 엔디언(Byte Order)

엔디언(Endian)이란, 쉽게 컴퓨터에 바이트가 정렬되는 방식을 말하는데요.

다른 표현으로는 바이트 저장 순서(Byte Order)라고도 하는데, 높은 바이트부터 저장되는 방식인 빅 엔디언(Big Endian)과 낮은 바이트부터 저장되는 방식인 리틀 엔디언(Little Endian)으로 나뉩니다.

각 방식에 대한 자세한 내용은 이어지는 내용을 통해 계속 살펴보겠습니다.

 

/*

미들 엔디언이라고 불리는 형태는 오래전에 사용되었던 형태로 현재는 사용이 매우 드물다고 합니다.

빅 엔디안과 리틀 엔디안 두 방식에 대해서는 각각의 장단점이 있으며, 방식이 다를 뿐 어떤 방식이 더 우수하다고 할 수는 없습니다.

*/

 

 

 

3. 빅 엔디언(Big Endian)

빅 엔디언(Big Endian)

메모리 주소 a a+1 a+2 a+3
저장되는 값 0x12 0x34 0x56 0x78

 

빅 엔디언은 메모리의 첫 주소에 높은 바이트(= 상위 데이터)부터 저장하는 방식입니다.

(MSB, Most Significant Bit)

 

위 이미지처럼 int num = 0x12345678(4byte)를 저장한다고 했을 때 0x12, 0x34, 0x56, 0x78(각 1byte) 순서로 메모리에 저장되는데요. 이처럼 빅 엔디언은 평소 우리가 숫자를 사용하는 선형적 사고방식과 같은 방식이며, 서로 다른 플랫폼끼리 네트워크 데이터 전송을 할 때 네트워크 바이트 오더(Network Byte Order)에서 빅 엔디안 방식이 규정으로 사용됩니다.

 

/*

Network Byte Order

네트워크 상에서 데이터를 전송할 때는 네트워크 바이트 오더를 따라야 한다는 규칙입니다. TCP, UDP, IPv4, IPv6와 같은 여러 프로토콜들이 데이터를 전송할 때 빅 엔디안 방식을 사용합니다. 

*/

 

빅 엔디언 방식의 장점은 선형적 방식으로 인해 메모리에 저장되는 순서 그대로 읽을 수 있으며, 때문에 이해하기가 쉽다는 장점(디버그가 쉽다는 장점)을 가지고 있습니다.

또한 상위 데이터가 메모리의 앞에서부터 저장되기 때문에 숫자 크기를 비교할 때 앞자리부터 비교하는 방식으로 인해 빠른 속도를 가집니다. 스팍(SPARC)을 포함한 대부분의 RISC CPU(축소 명령어 집합 컴퓨터) 계열에서는 이 방식으로 데이터를 저장합니다.

 

 

 

4. 리틀 엔디언(Little Endian)

리틀 엔디언(Little Endian)

메모리 주소 a a+1 a+2 a+3
저장되는 값 0x78 0x56 0x34 0x12

 

리틀 엔디언은 메모리의 첫 주소에 낮은 바이트(= 하위 데이터)부터 저장하는 방식입니다.

(LSB, Least Significant Bit)

 

빅 엔디언과는 반대로 int num = 0x12345678(4byte)를 저장한다고 했을 때 0x78, 0x56, 0x34, 0x12 순서로 메모리에 저장됩니다.

일반적으로 덧셈과 뺄셈 같은 연산을 할 때, 가장 낮은 자릿수에 있는 숫자부터 계산하여 자릿수 올림이 있는지 여부를 판단하기 때문에 이러한 원리로 인해 산술 연산에서는 리틀 엔디언의 속도가 빅 엔디언에 비해 빠릅니다.

Intel CPU 계열에서 리틀 엔디언 방식으로 데이터를 저장하고 있으며, 최초 암호화폐인 비트코인 블록체인 헤더의 각 필드 값도 리틀 엔디언 방식으로 저장됩니다.

 

위에서 언급한 것처럼 네트워크 상에서는 데이터 전송할 때 빅 엔디언 방식이 사용되기 때문에 Intel 기반의 시스템에서 소켓 통신을 할 때는 바이트 순서에 신경을 써서 데이터를 전달해야 한다는 특징이 있습니다.

 

 

 

5. Java에서 사용되는 방식은?

ByteOrder

Java는 CPU 아키텍처와 무관하게 JVM이라는 자바 바이트 코드를 해석하고 실행하는 가상 머신을 사용하는데요.

플랫폼의 독립성을 유지하기 위해 고정된 바이트 오더를 유지해야 하므로 네트워크 전송 시에 사용되는 바이트 오더인 빅 엔디언을 사용하며, JVM에서 문자열 저장에 사용되는 인코딩은 UTF-16 BE가 사용됩니다.

(Java에는 바이트 오더를 관리하기 위한 ByteOrder 객체가 있습니다.)

반응형