티스토리 뷰
CPU 데이터를 처리하기 위해서 우선적으로 메모리에 데이터가 적재되야한다.
CPU는 여러 회사들이 만들기 때문에 처리할 환경에 적합한 바이트 순서(byte order)를 사용한다.
바이트 순서(Byte order)란, 데이터를 메모리에 적재하는 방법이라고 생각하면 된다.
엔디언은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 의미한다.
바이트를 배열하는 방법을 바이트 순서(Byte order)라 한다.
엔디언은 보통 큰 단위가 앞에 나오는 빅 엔디언(Big-Endian)과
작은 단위가 앞에 나오는 리틀 엔디언(Little-Endian)으로 나눌 수 있다.
- 빅 엔디언 (Big-Endian)
- 네트워크 통신에서 사용되는 정렬 방식이다.
- 상위 바이트(high byte)가 메모리에 먼저 기록되는 방식이다.
- 스택에서 PUSH될 때 맨 앞(메모리 주소가 낮은)에서부터 진행된다.
- 사용자가 눈으로 보기 편하기 때문에 디버그 환경에 적합하다.
- 비교 연산에서 Little-Endian보다 빠르다.
0x12345678 값이 빅 엔디언 방식으로 정렬되면
[12][34][56][78] 로 메모리에 기록된다. (뒤로 갈 수록 메모리 주소는 커진다)
- 리틀 엔디언 (Little-Endian)
- 하위 바이트(low byte)가 메모리에 먼저 기록되는 방식이다.
- 오늘날의 가정용 데스크탑에 흔히 쓰이는 인텔 CPU계열에서 사용되는 정렬 방식이다.
- 하위 바이트(low byte)가 먼저 기록되기 때문에 하위 바이트만 사용할 때 따로 계산하지 않아도 된다.
- 스택에서 PUSH될 때 맨 뒤(메모리 주소가 높은)에서 부터 진행된다.
- 계산 연산에서 Big-Endian보다 빠르다.
한번 보고서는 이해하기 힘든 녀석이다.
0x12345678 값이 리틀 엔디언 방식으로 정렬되면
[78][56][45][12] 로 메모리를 차지하게 된다. (뒤로 갈 수록 메모리 주소는 커진다)
빅 엔디언(Big-Endian) 방식은 우리가 숫자를 읽고 쓰는 방식과 동일하기 때문에 느끼기엔 편리하다.
리틀 엔디언(Little-Endian) 방식은 새로운 정렬방식이기에 조금 복잡할 수 있다.
직접 Visual Studio를 통해 메모리를 확인해보면 다음과 같이 Little Endian 방식으로
메모리가 기록된 것을 눈으로 확인할 수 있다.
네트워크 통신은 Big-Endian 방식을 사용한다.
그 밖에도 Middle-Endian이 존재하지만 따로 공부하지 않는다.
Big-Endian으로 정렬된 데이터를 스택에 push, 그리고 pop하면 데이터가 Little-Endian 방식으로 정렬된다.
0x12345678 값을 바이트로 스택에 넣고 빼보겠다. (12부터 스택에 푸쉬 한다)
| stack[3]: 78 |
| stack[2]: 56 |
| stack[1]: 34 |
| stack[0]: 12 |
이제 스택을 pop하면 다음과 같다.
| stack pop[0] = 78 |
| stack pop[1] = 56 |
| stack pop[2] = 34 |
| stack pop[3] = 12 |
결과: [78][56][34][12]
꺼낸 바이트값을 SHIFT해주는 것을 잊진 말자. (4byte 기준 24, 16, 8 만큼 좌측으로 밀면 된다.)