비트·바이트·주소
저장 크기와 주소 공간을 구분하고 바이트 주소·정렬·엔디언을 작은 메모리 표로 확인합니다.
“32비트 컴퓨터의 메모리는 32바이트인가?”라는 질문에는 저장 단위와 주소를 먼저 구분해야 답할 수 있습니다. 비트 수는 문맥에 따라 값의 폭, 주소의 폭, 전송 경로의 폭을 말할 수 있습니다.
비트에서 바이트로
비트(bit) 하나는 0 또는 1로 표현하는 자리입니다. n개 비트의 서로 다른 패턴은 2ⁿ개입니다. 3비트면 000부터 111까지 8개이고, 패턴을 부호 없는 정수로 해석하면 0~7입니다. 바이트는 8비트입니다. 워드(word)는 CPU가 다루는 기본 폭을 가리키는 말이지만 크기가 시스템마다 다르므로 “이 모델에서는 32비트 워드”처럼 정의해야 합니다.
KiB는 1,024바이트, MiB는 1,024 KiB입니다. kB는 1,000바이트입니다. 저장 크기를 계산할 때 표기의 기준을 적으세요. 16 × 1024 = 16384 바이트는 16 KiB입니다.
주소는 위치를 식별합니다
이 교재는 기본적으로 바이트 주소 방식을 사용합니다. 주소 0·1·2는 각각 다른 1바이트 위치입니다. 주소 폭이 8비트이면 주소 패턴은 256개이고 주소 공간은 256바이트입니다. 그 공간이 모두 실제 RAM으로 장착됐다는 뜻은 아닙니다.
4바이트 값을 주소 8부터 저장하면 주소 8·9·10·11을 차지합니다. 다음 값은 12부터 놓을 수 있습니다. 정렬(alignment)은 데이터가 정해진 경계에 놓이는 조건입니다. 4바이트 정렬 주소는 4의 배수입니다. 정렬되지 않은 접근의 허용과 비용은 ISA·플랫폼마다 다르므로 여기서는 4바이트 값의 시작을 4의 배수로 제한합니다.
같은 값의 바이트 순서
16진수 0x12345678을 4바이트로 나누면 12, 34, 56, 78입니다. 엔디언(endianness)은 여러 바이트를 주소 순서로 놓는 방식입니다.
| 주소 | 리틀 엔디언 | 빅 엔디언 |
|---|---|---|
| 8 | 78 | 12 |
| 9 | 56 | 34 |
| 10 | 34 | 56 |
| 11 | 12 | 78 |
리틀 엔디언은 하위 바이트가 낮은 주소에 놓입니다. 비트 문자열을 거꾸로 뒤집는 것이 아닙니다. 값 자체는 두 경우 모두 같습니다. 네트워크·파일·CPU 표현을 섞을 때는 변환 규약을 확인해야 합니다.
Python 준비: bytes는 바이트들의 묶음, hex()는 16진 표기, assert는 조건이 참인지 확인하는 문장입니다. 다음을 파일에 저장해 python 파일명.py로 실행하면 외부 패키지 없이 순서를 확인합니다.
value = 0x12345678
little = value.to_bytes(4, "little")
big = value.to_bytes(4, "big")
print(little.hex(), big.hex())
assert int.from_bytes(little, "little") == value
assert int.from_bytes(big, "big") == value출력은 78563412 12345678입니다. Python 정수는 이 교재의 고정 길이 레지스터와 달리 큰 값을 자동으로 지원합니다. 고정 폭 계산은 다음 장에서 명시적으로 제한합니다.
독립 문제: 주소와 용량
10비트 바이트 주소 공간에 2바이트 정수를 주소 100부터 빈틈없이 12개 저장합니다. 마지막 정수의 시작 주소와 마지막 바이트 주소를 구하세요. 주소 101부터 2바이트 정렬을 요구하는 값을 저장해도 되는지 판단하세요.
힌트
첫 정수가 0번째이고 마지막이 11번째입니다. 시작 주소와 차지한 범위의 마지막을 구분하세요.
풀이와 확인
주소 공간은 2¹⁰ = 1,024바이트입니다. 마지막 정수는 100 + 11 × 2 = 122에서 시작해 123까지 사용합니다. 주소 101은 홀수이므로 이 문제의 2바이트 정렬 조건을 만족하지 않습니다. “10비트면 값도 모두 10비트”라는 결론은 나오지 않습니다. 주소 폭과 데이터 폭은 별도 조건입니다.
주소 계산을 틀렸다면 읽기·쓰기 추적을 다시 보고, 다음 절의 진법에서는 주소와 데이터를 실제 비트 패턴으로 표현해 보세요.