본문 바로가기

C언어

Byte order

컴퓨터 메모리에 데이터가 저장될 때 어떻게 저장될까?

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