(ASM) 참고용 정리 - 리틀 엔디안, 빅 엔디안
엔디안은 시스템 프로그래밍에서 많이 쓰이는 용어이다.
엔디안은 메모리의 저장 및 처리 방식을 말하는 것이다.
이는 바이트 순서(Byte Order)와도 큰 관련이 있다.
- 빅 엔디안(Big Endian)
메모리의 높은 번지 부터 저장하는 방식
MSB(Most Significant Byte), 최상위 바이트부터 차례로 저장한다. - 리틀 엔디안(Little Endian)
메모리의 낮은 번지 부터 저장 하는 방식
LSB(Least Significant Byte), 최하위 바이트부터 차례로 저장한다.
4바이트에 값이 저장되는 방식을 알아보자.
10진수 | 빅 엔디안 | 리틀 엔디안 |
---|---|---|
0 | 0x00000000 | 0x00000000 |
1 | 0x00000001 | 0x01000000 |
2 | 0x00000002 | 0x02000000 |
3 | 0x00000003 | 0x03000000 |
4 | 0x00000004 | 0x04000000 |
5 | 0x00000005 | 0x05000000 |
6 | 0x00000006 | 0x06000000 |
7 | 0x00000007 | 0x07000000 |
8 | 0x00000008 | 0x08000000 |
9 | 0x00000009 | 0x09000000 |
10 | 0x0000000A | 0x0A000000 |
11 | 0x0000000B | 0x0B000000 |
12 | 0x0000000C | 0x0C000000 |
13 | 0x0000000D | 0x0D000000 |
14 | 0x0000000E | 0x0E000000 |
15 | 0x0000000F | 0x0F000000 |
빅 엔디안 방식이 우리가 자주 생각하는 저장 방식이다.
빅 엔디안은 가독성이 뛰어나고 대소 비교도 편하고 등등의 장점이 많다.
또한 네트워크 통신에서는 빅 엔디안 방식을 이용하자고 약속하였다.
0x00000001을 A 컴퓨터는 빅 엔디안 방식으로 숫자 ‘1’을 보낸것인데
리틀 엔디안 방식인 컴퓨터 B는 데이터를 받을 때 0x01000000으로 받는다.
그럼 A는 숫자 ‘1’을 보냈는데 컴퓨터 B는 ‘268435456’을 받은 꼴이 돼버리기 때문이다.
그럼 리틀 엔디안은 왜 나왔을까…?
가산기를 설계할 때 올림수를 계산하기 편하고, 빠르기 위함이란다.
15 + 1 을 빅 엔디안 방식으로 계산하면
0x0000000F + 0x00000001 = 0x00000010
으로 계산 후 최하위 바이트로 이동해서 올림수가 발생한다.
이번앤 리틀 엔디안 방식으로 계산해보자.
0x0F000000 + 0x01000000 = 0x10000000
올림수를 계산할 때 최상위 바이트에서 바로 올림수가 가능하기 때문이다.
라고 이해했는데 뭐 케바케기도 할 것 같고 요즘엔 둘 사이에 차이가 거의 없다고 한다.
또한 이런 엔디안은 CPU에 의존적이다.
주로 인텔 CPU가 리틀 엔디안 방식을 사용한다고 한다.
비디오 게임기인 SFC, NDS 등등에서도 리틀 엔디안 방식을 사용하는 경우가 많으니 참고하자.