바이트 저장 순서
컴퓨터는 데이터를 메모리에 저장할 때 Byte 단위로 나누어 저장합니다. 따라서 연속되는 바이트를 순서대로 저장해야 하는데, 이것을 바이트 저장 순서(Byte Order)라고 합니다. 이때 바이트가 저장된 순서에 따라 빅 엔디안, 리틀 엔디안 두가지 방식으로 나눌 수 있습니다.
빅 엔디안(Big-endian)
빅 엔디안 방식은 낮은 주소에 데이터의 높은 바이트(MSB : Most Significant Byte)부터 저장하는 방식입니다. 이 방식은 평소 사람이 사용하는 선형 방식과 같아 메모리에 저장된 순서 그대로 읽을 수 있으며, 이해하기 쉽습니다.
예를 들어, 아래와 같이 저장할 32bit 크기의 정수가 있을 때, 빅엔디안은 다음과 같이 저장합니다.
0x12345678
리틀 엔디안(Little-endian)
리틀 엔디안 방식은 낮은 주소에 데이터의 낮은 바이트(LSB : Least Significant Byte)를 저장하는 방식입니다. 이 방식은 평소 사람이 숫자를 사용하는 선형 방식과 반대로 읽어야 합니다.
앞서 예시인 0x12345678 을 리틀 엔디안으로 나타내면 다음과 같습니다.
장단점
1. 덧셈 연산
덧셈 연산을 수행할 때는 LSB 부터 시작하여 자리 올림(Carry)를 계산해야 합니다.
이 때, 리틀 엔디안에서는 첫 번째 바이트가 LSB가 되기 때문에 가산기 설계가 조금 더 단순화 됩니다.
반면, 빅 엔디안에서는 첫 번째 바이트가 MSB 가 되기 때문에 가산기가 덧셈을 할 때 마지막 바이트 부터 계산을 하므로 복잡해집니다.
따라서, 리틀 엔디안이 덧셈 연산에서는 비교적 우위에 있다고 할 수 있습니다. 하지만 위키피디아에 의하면 오늘 날 CPU는 여러개의 바이트를 동시에 읽어 덧셈을 수행하므로 차이가 거의 없다라고 설명하고 있습니다.
2. 하위 비트 사용
32비트 숫자 0x12345678 을 빅 엔디안과 리틀 엔디안으로 각각 표현하면 다음과 같습니다.
각각의 엔디안에서 하위 16비트에 접근하려면 어떻게 해야할까요?
빅엔디안은 변수 주소 0x0000 에 2바이트를 더한 0x0008 에서 해당값을 얻어와야합니다.
반면에 리틀 엔디안에서는 변수의 첫 주소인 0x0000 에서 바로 하위 16비트를 읽어 올 수 있습니다.
하지만 이 부분에 대해서는 누가 상대적으로 낫다라고 말할 수는 없을 것 같습니다. 왜냐하면 상위 16비트를 읽을 경우 반대의 상황이 발생하기 때문입니다.
무승부
3. 숫자 비교
숫자 비교에서는 빅 엔디안의 경우 큰 자리 수가 메모리의 가장 처음에 위치하게 되므로 리틀 엔디안 보다 상대적으로 빠르다고 할 수 있습니다.
4. 디버깅
디버깅 측면에서는 메모리의 특정 범위 값을 확인할 때 리틀 엔디안이라면 모든 값이 반대로 되어 있으므로 사람이 익숙한 환경이 아닐 것입니다. 하지만 빅엔디안은 사람이 읽는 순서와 동일하기 때문에 쉽게 디버깅이 가능합니다.
다른 타입의 엔디안을 사용하면서 발생하는 문제
A 컴퓨터는 INTEL 프로세서를 사용하고 있어 리틀 엔디안 방식을 사용하고, B 서버는 빅엔디안 사용한다고 가정하겠습니다.
만약 엔디안 방식을 고려하지 않고 데이터를 보내게 되면 A는 0x1234 라는 데이터를 보냈지만 빅엔디안이 읽는 방식에서는 0x3412 가 되어버리게 됩니다.
따라서 이러한 문제점을 해결하기위해 규칙이 만들어지게 됩니다.
네트워크 바이트 오더
네트워크 상에 데이터를 전송할 떄는 네트워크 바이트 오더를 따라야합니다. 네트워크 바이트 오더에선 빅 엔디안이 가장 흔한 포맷입니다. 따라서 TCP, UDP, IPv4, IPv6과 같은 프로토콜들은 데이터를 전송할 때 빅 엔디안 방식을 사용합니다.
참고자료
1. https://jhnyang.tistory.com/entry/%EC%97%94%EB%94%94%EC%95%88
2. https://code-lab1.tistory.com/179
3. https://ko.wikipedia.org/wiki/%EC%97%94%EB%94%94%EC%96%B8
'CS > 컴퓨터구조' 카테고리의 다른 글
명령어 집합 구조, CISC 와 RISC (0) | 2023.04.05 |
---|---|
패리티 비트 & 해밍 코드 (0) | 2023.04.04 |
CPU의 구조와 기능 (0) | 2023.04.04 |
컴퓨터 시스템의 개요 (0) | 2023.04.03 |
캐시 메모리의 쓰기 정책 / 버퍼와 캐시의 차이 (0) | 2023.04.02 |