컴퓨터 메모리에 데이터가 저장될 때 어떻게 저장될까?
Byte order는 쉽게 데이터를 저장할 때 낮은주소부터 또는 높은주소부터 저장하는 방식을 말하는데, 크게 리틀엔디안과 빅엔디안 방식이 있다. 한 번 알아보자.
리틀 엔디안
예전에 16진수 두 자리(0x00~0xFF)가 왜 1Byte인지 몰랐는데 나처럼 헷갈리는 사람이 있을 것 같아 먼저 설명하겠다.
2진수 4자리로 표현할 수 있는 개수는 2의 4승이므로 총 16개다.
2진수 한 자리당 1bit이므로, 0000~1111은 16가지를 표현할 수 있다는 뜻이다.
16진수 1자리로 표현 할 수 있는 개수는 16개다.
즉, 16진수 1자리(0x0 ~ 0xF)는 4bits라는 뜻이므로 16진수 2자리(0x00~0xFF)는 1byte이다.
이걸 설명한 이유는 데이터는 Byte단위로 저장되기 때문이다.
0x12345678을 메모리에 리틀 엔디안 방식으로 저장한다면
0x78563412 <- 이렇게 데이터의 하위바이트가 낮은 번지수(주소)에 오도록 저장된다.
0x87654321이 아닌 이유는 아까 말했듯이 데이터는 Byte단위로 저장되므로 1byte씩 쪼개서 저장했기 때문이다.
!읽을 때는 다시 뒤집어서 가져온다.
ex)4byte read -> 0x5678
빅 엔디안
반대로 빅엔디안은 데이터의 상위바이트를 낮은 번지수(주소)에 저장한다.
0x12345678 -> 0x12345678
장단점
1. 빅엔디안은 사람이 읽기 편하므로 디버깅할 때 편하다.
2. 리틀 엔디안은 사람이 읽기는 조금 불편하지만 컴퓨터(ALU)가 메모리를 낮은 주소부터 읽기 때문에 계산이 더 쉽다.
주의
1. 한 바이트씩 저장하기 때문에 bit는 전혀 영향을 안받는다.
2. 다른 시스템끼리 데이터를 전송할 때 저장 방식이 다르면 변환해주는 작업이 필요한다. TCP/IP 프로토콜은 빅엔디안을 따른다.(그냥 정해진 약속이다.)
'C언어' 카테고리의 다른 글
함수 포인터 (0) | 2020.02.23 |
---|---|
크기가 명시된 정수 자료형 (0) | 2020.02.21 |