메모리에 78 56 34 12라는 네 바이트가 차례로 놓여 있다. 이 값을 하나의 정수로 읽으면 0x12345678일 수도 있고 0x78563412일 수도 있다. 바이트를 놓은 순서와 숫자를 조립하는 규칙을 함께 알아야 값을 결정할 수 있다.
비트(bit)는 0 또는 1로 나타내는 정보 단위이고, 바이트(byte)는 보통 비트 8개를 묶은 단위다. 메모리(memory)는 실행 중인 프로그램이 값을 읽고 쓰는 공간이며, 주소(address)는 그 위치를 가리킨다. 16진수(hexadecimal)는 한 자리에 0부터 9와 A부터 F까지 쓰는 표기다. 0x는 뒤에 오는 숫자가 16진수라는 표시이고, 16진수 두 자리는 한 바이트와 대응한다.
낮은 주소부터 어떤 바이트를 놓았나
여러 바이트로 된 값을 메모리에 놓는 순서를 엔디언 방식(endianness)이라고 한다. 리틀 엔디언(little-endian)은 값의 작은 자릿값을 담당하는 바이트를 낮은 주소에 둔다. 빅 엔디언(big-endian)은 큰 자릿값을 담당하는 바이트를 낮은 주소에 둔다.
0x12345678은 네 바이트 12, 34, 56, 78로 나뉜다. 12가 큰 자릿값, 78이 작은 자릿값을 담당한다. 주소가 낮은 곳부터 늘어난다고 적으면 다음과 같다.
주소 0x1000 0x1001 0x1002 0x1003
리틀 엔디언의 바이트 78 56 34 12
빅 엔디언의 바이트 12 34 56 78
따라서 주소 0x1000부터 78 56 34 12를 읽었다면 리틀 엔디언 규칙으로 조립할 때 0x12345678이다. 빅 엔디언 규칙으로 조립하면 0x78563412가 된다. 바이트 안의 78을 87로 뒤집는 규칙은 아니다. 바이트 네 개의 순서를 정하는 규칙이다.
바이트에는 ‘정수’라는 꼬리표가 붙어 있나
같은 네 바이트를 반드시 32비트 정수 하나로 읽어야 하는 것도 아니다. 각각 8비트 정수 넷일 수도 있고, 문자나 명령어의 일부일 수도 있다. 자료형(data type)은 값의 종류와 어떤 연산을 할지 정하는 규칙이다. 프로그램이 자료형과 크기를 정하고 읽는 명령을 고르기 때문에 바이트열의 해석이 결정된다.
예를 들어 0x41 한 바이트는 정수로 읽으면 65다. 미국 정보 교환 표준 부호(American Standard Code for Information Interchange, ASCII)의 문자 규칙으로 읽으면 A다. 바이트가 변한 것은 아니다. 적용한 규칙이 달라졌다.
파일이나 네트워크에서 왜 문제가 되나
한 시스템이 네 바이트를 리틀 엔디언으로 저장한 뒤 다른 시스템이 빅 엔디언으로 읽으면 값이 달라진다. 파일 형식이나 통신 규약은 숫자의 크기와 바이트 순서를 명시해야 한다. 이를 모른 채 받은 바이트를 컴퓨터의 기본 정수형으로 바로 읽으면 실행 환경에 따라 다른 값이 나올 수 있다.
문자열을 보낼 때도 바이트 순서만 합의하면 끝나지 않는다. 어떤 문자 인코딩을 쓰는지, 길이를 바이트로 세는지 문자로 세는지도 정해야 한다. 저장된 바이트와 그 바이트를 읽는 규칙을 함께 기록해야 다른 곳에서 같은 뜻으로 복원할 수 있다.
참고 자료
'배움과 성장 > 시스템·성능' 카테고리의 다른 글
| 여러 서버를 거치는 요청의 시간 제한은 어떻게 나눌까? (0) | 2026.10.31 |
|---|---|
| 1비트 두 개를 더하는데 왜 결과는 두 자리가 필요할까? (0) | 2026.10.30 |
| 요청이 느릴 때 서버의 어느 줄에서 기다리고 있을까? (0) | 2026.10.27 |
| 8비트에 260을 넣으면 왜 4가 남을까? (0) | 2026.10.26 |
| 화면이 뜨는 데 5초가 걸렸다면 어디서 기다렸을까? (0) | 2026.10.25 |
댓글