바이트
고친 사람 github-actions[bot]
바이트는 컴퓨터가 데이터의 양을 셀 때 쓰는 기본 단위입니다. 파일의 크기도 메모리의 크기도 이 단위로 잽니다. 메모리는 이 단위마다 번호를 붙여 값을 찾습니다. 오늘날에는 대개 비트 여덟 개가 한 바이트입니다.
쉽고 빠른 이해
바이트는 데이터의 양을 세는 기본 단위입니다. 영문 글자 하나가 한 바이트에 들어갑니다.
비트 하나는 0 과 1 둘 중 하나만 담습니다. 글자 하나를 적으려면 비트 여러 개가 한 묶음으로 움직여야 합니다. 그 묶음마다 주소라는 번호를 달아 두면 값을 찾아 꺼내기 쉬워집니다.
쓰는 방법은 이렇습니다.
- 비트 여러 개를 묶어 한 바이트로 씁니다. 오늘날에는 대개 여덟 개입니다
- 메모리에서 바이트마다 주소를 매깁니다
- 한 바이트에 안 들어가는 값은 바이트 여러 개를 이어 붙여 담습니다
대가는 아주 작은 값도 혼자 두면 한 바이트를 차지한다는 것입니다. 참과 거짓 하나만 담아도 한 바이트를 다 씁니다.
상세
계란은 가게에서 한 알씩 팔지 않습니다. 열 알이나 서른 알을 한 판에 담아 팝니다. 창고에 쌓을 때도 값을 매길 때도 판이 단위입니다.
바이트는 계란 판처럼 비트 여러 개를 하나로 묶은 단위입니다. 비트는 0 또는 1 하나를 담는 가장 작은 단위입니다. 오늘날 한 바이트는 거의 언제나 비트 여덟 개입니다. 비트 수를 못 박지 않는 언어 표준도 있습니다. 이 갈림은 이견 절에서 다룹니다.
여덟 비트 바이트를 펼쳐 놓으면 0 또는 1 이 하나씩 들어가는 칸 여덟 개입니다.
block-beta columns 8 b1["1"] b2["0"] b3["1"] b4["1"] b5["0"] b6["0"] b7["0"] b8["1"] byte["한 바이트"]:8
칸 여덟 개에서 나오는 0 과 1 의 조합은 256가지입니다. 음수 없이 읽으면 0 부터 255 까지를 담습니다. 영문 글자와 숫자, 기호를 적는 ASCII(American Standard Code for Information Interchange) 글자는 하나가 한 바이트에 들어갑니다.
바이트마다 매기는 주소
메모리는 값을 담는 칸마다 번호를 붙여 둡니다. 이 번호를 주소라고 부릅니다. 프로그램은 주소를 대서 값을 읽고 씁니다.
바이트는 주소를 매길 수 있는 단위입니다. 바이트 하나하나에 저마다 다른 주소를 댈 수 있습니다. 비트에는 이런 약속이 없습니다. 비트 하나하나에 주소를 댈 수 있어야 한다는 조건이 걸려 있지 않습니다. 오늘날 흔한 기계도 주소를 바이트마다 매깁니다.
주소를 받는 값 가운데 가장 작은 것이 한 바이트입니다. 그래서 참과 거짓 하나만 담는 값도 혼자 두면 한 바이트를 차지합니다. 한 바이트 안의 비트를 나눠 쓰려면 비트 연산 같은 방법을 써야 합니다.
한 바이트를 적는 세 표기
같은 한 바이트라도 사람이 적을 때는 표기가 셋으로 갈립니다. 이진은 0 과 1 만으로 적는 표기입니다. 16진은 0부터 9까지와 a부터 f까지 열여섯 글자로 수를 적는 표기입니다. 어느 쪽으로 적어도 기계 안의 값은 하나입니다.
위 그림의 한 바이트 1011 0001 을 셋으로 적어 보겠습니다.
| 표기 | 같은 바이트를 적은 꼴 |
|---|---|
| 이진 | 1011 0001 |
| 십진 | 177 |
| 16진 | 0xb1 |
실무에서 바이트를 눈으로 볼 때는 대개 16진 표기를 씁니다. 네 비트가 16진 글자 하나에 맞아떨어집니다. 그래서 여덟 비트는 언제나 글자 두 개로 적힙니다. 이진으로 적으면 글자가 여덟 개라 깁니다. 십진으로 적으면 몇 글자가 될지 값마다 달라집니다.
여러 바이트를 이어 붙인 값
0 부터 255 까지를 넘는 수는 한 바이트에 안 들어갑니다. 그럴 때는 주소가 이어진 바이트 여러 개에 나눠 담습니다. 읽을 때는 그 바이트들을 한 값으로 읽습니다. 아래는 주소 0 부터 3 까지의 바이트 넷을 한 값으로 묶은 모습입니다.
block-beta columns 4 a0["주소 0"] a1["주소 1"] a2["주소 2"] a3["주소 3"] b0["바이트"] b1["바이트"] b2["바이트"] b3["바이트"] v["한 값 · 바이트 넷"]:4
바이트 둘이면 65,536가지, 바이트 넷이면 약 43억 가지 값을 담습니다.
바이트를 이어 붙이고 나면 물음이 하나 생깁니다. 큰 자릿수를 앞 바이트에 둘지 뒤 바이트에 둘지입니다. 기계마다 답이 다릅니다. 이 차례를 엔디언이라고 부릅니다. 파일 첫머리에 어느 차례로 적었는지 밝혀 두는 바이트 순서 표시도 있습니다.
바이트로 세는 크기와 비트로 세는 속도
파일과 메모리의 크기는 바이트 개수로 잽니다. 수가 커지면 킬로바이트 · 메가바이트 · 기가바이트처럼 앞에 배수를 붙여 줄여 부릅니다. 킬로가 1000 인지 1024 인지는 쓰는 쪽마다 갈립니다. 이 갈림도 이견 절에서 다룹니다.
통신에서 데이터를 나르는 빠르기는 흔히 초당 비트 수로 셉니다. 초당 1킬로비트는 초당 1000 비트입니다. 크기를 세는 바이트와 섞어 읽으면 여덟 배가 어긋납니다.
배경
글자와 다른 이름
1950년대 컴퓨터는 메모리와 비트 묶음을 한 번에 주고받았습니다. 이 묶음을 워드라고 부릅니다. 워드의 크기는 메모리 구조가 정합니다. 입출력 장치와 한 번에 주고받는 비트 수는 워드와 다를 때가 많았습니다. 그 시절 입출력 장치는 비트 여섯 개를 한 번에 다뤘습니다.
글자를 적는 쪽에도 사정이 있었습니다. 글자를 비트로 옮기는 규칙을 부호라고 합니다. 같은 글자라도 쓰는 곳에 따라 다른 부호로 적힐 수 있었습니다. 부호가 다르면 글자 하나에 드는 비트 수도 다를 수 있었습니다.
그래서 기계가 다루는 비트 묶음에는 「글자」와 다른 이름이 필요했습니다. 같은 글자 하나가 부호에 따라 크기가 다른 비트 묶음이 되기 때문입니다. 입출력 장치가 주고받는 비트 묶음은 글자와 아무 상관이 없을 때도 있었습니다.
1956년 IBM(International Business Machines)의 Stretch 컴퓨터 설계팀이 이 묶음을 바이트라고 불렀습니다. 글자 하나를 적는 비트 묶음도, 입출력 장치와 한 번에 주고받는 비트 수도 바이트였습니다.
여덟 비트로 굳기까지
처음 바이트에는 정해진 길이가 없었습니다. 첫 기록은 바이트를 한 비트에서 여섯 비트까지의 묶음으로 적었습니다. 그때그때 맞는 길이를 쓴다는 뜻입니다. 몇 달 뒤 설계팀은 여덟 비트 바이트를 검토했습니다. Stretch 설계는 곧 이것을 받아들였습니다.
Stretch 에서 여덟 비트는 바이트 길이의 최댓값이었습니다. 십진 숫자는 네 비트 바이트로도 담을 수 있었습니다. 글자를 적는 부호에는 여덟 비트 바이트를 골랐습니다. 설계팀이 든 이유는 다섯입니다.
- 256가지 글자면 대부분의 쓰임새에 충분하다고 봤습니다
- 256가지 안에서는 글자 하나가 바이트 하나입니다. 그래서 기록의 길이가 그 기록에 어떤 글자가 들었느냐에 매이지 않습니다
- 여덟 비트 바이트는 저장 공간을 꽤 아낍니다
- 십진 숫자 하나는 네 비트면 됩니다. 한 바이트에 숫자 둘을 담을 수 있습니다
- 4와 8은 2의 거듭제곱입니다. 그래서 이진수로 주소를 계산하는 기능을 비트 하나 단위까지 쓸 수 있습니다
Stretch 는 명령에 따라 메모리의 비트 하나하나에도 주소를 댈 수 있었습니다. 뒤에 나온 IBM System/360 은 Stretch 의 개념을 여럿 이어받았습니다. 2의 거듭제곱인 바이트 크기와 워드 크기도 그 가운데 하나입니다.
System/360 에서 달라진 것은 둘입니다. 비용을 아끼려고 바이트 길이를 최댓값인 여덟 비트 하나로 고정했습니다. 비트마다 매기던 주소도 바이트마다 매기는 주소로 바꿨습니다. 그 뒤로 바이트는 대개 여덟 비트를 뜻하게 됐습니다.
예시
「한국어」 세 글자의 UTF-8 바이트
유니코드는 세계의 글자마다 번호를 하나씩 붙인 표입니다. UTF-8(Unicode Transformation Format, 8비트 단위)은 그 번호를 바이트로 적는 방식입니다. 「한국어」 세 글자를 UTF-8 로 적으면 바이트 아홉 개가 됩니다.
| 글자 | 유니코드 번호 | UTF-8 바이트 |
|---|---|---|
| 한 | U+D55C |
ED 95 9C |
| 국 | U+AD6D |
EA B5 AD |
| 어 | U+C5B4 |
EC 96 B4 |
글자 수와 바이트 수가 같지 않습니다. 반면 ASCII 글자는 UTF-8 에서도 한 글자가 한 바이트입니다. 표의 바이트는 하나마다 16진 글자 두 개로 적혀 있습니다.
C 언어의 sizeof 와 CHAR_BIT
C 언어의 sizeof 연산자는 피연산자의 크기를 바이트 수로 돌려줍니다. 글자 하나를 담는
자료형 char 에 쓰면 결과는 언제나 1 입니다.
sizeof(char) /* 언제나 1 — char 하나가 바이트 하나다 */
CHAR_BIT /* 한 바이트의 비트 수. 8 보다 작을 수 없다 */
C 에서 바이트는 곧 「char 하나의 크기」입니다. 몇 비트인지는 <limits.h> 에 들어 있는
CHAR_BIT 를 봐야 압니다.
디스크 용량의 기가바이트
Seagate 의 BarraCuda 2.5인치 하드디스크는 1 기가바이트를 10억 바이트로, 1 테라바이트를 1조 바이트로 셉니다. 컴퓨터의 운영체제는 다른 기준으로 재서 용량을 더 작게 보여 줄 수 있습니다. 표시된 용량 가운데 일부는 포맷 같은 용도로 쓰여 데이터를 담지 못합니다. Western Digital 의 WD Blue 하드디스크도 1 메가바이트를 100만 바이트로, 1 기가바이트를 10억 바이트로 셉니다.
두 기준의 차이를 수로 보면 이렇습니다. 2의 30제곱 바이트는 기비바이트라고 부릅니다.
| 단위 | 바이트 수 |
|---|---|
| 1 기가바이트 (10의 9제곱) | 1,000,000,000 |
| 1 기비바이트 (2의 30제곱) | 1,073,741,824 |
같은 바이트 수를 2의 30제곱으로 나누면 10의 9제곱으로 나눌 때보다 숫자가 7% 가량 작게 나옵니다.
이견
바이트의 정의는 두 군데서 갈립니다. 한 바이트가 몇 비트인가와 킬로바이트가 몇 바이트인가입니다.
한 바이트의 비트 수
C 언어 표준은 국제표준화기구(ISO, International Organization for Standardization)와 국제전기기술위원회(IEC, International Electrotechnical Commission)가 함께 냅니다. 표준 번호는 ISO/IEC 9899 입니다.
이 표준에서 바이트는 주소를 매길 수 있는 저장 단위입니다. 실행 환경의 기본 글자 하나를 담을 만큼 커야 한다는 조건만 겁니다. 비트 수는 구현이 정하게 두었습니다. 다만 8 보다 작아서는 안 됩니다.
단위를 다루는 쪽은 여덟 비트로 적습니다. 미국 국립표준기술연구소(NIST, National Institute of Standards and Technology)의 단위 비교표에서 1 바이트는 8 비트입니다.
네트워크 표준은 여덟 비트를 못 박을 때 바이트보다 옥텟이라는 말을 즐겨 씁니다. 옥텟은 언제나 여덟 비트인 단위입니다. 바이트를 여덟 비트가 아닌 크기로 쓰는 시스템이 있기 때문입니다.
인터넷 표준을 내는 IETF(Internet Engineering Task Force)도 같은 사정을 댑니다. 오늘날 바이트는 거의 언제나 옥텟과 같습니다. 그래도 여섯 비트나 아홉 비트 바이트를 쓴 기계가 있었습니다. 그래서 IETF 의 인터넷 보안 용어집은 표준 문서가 바이트라는 말을 처음 쓸 때 비트 수를 밝혀야 한다(SHOULD)고 권합니다.
킬로바이트의 크기
| 누가 | 킬로를 얼마로 두나 |
|---|---|
| 국제단위계(SI, International System of Units) | 언제나 1000 (2의 거듭제곱 뜻으로는 쓰지 말 것) |
| 국제전기기술위원회(IEC) | 1024 에 키비(Ki)라는 이름을 따로 붙임 |
| JEDEC(Joint Electron Device Engineering Council) | 반도체 메모리 용량에서 1024 |
| 하드디스크 제조사 Seagate · Western Digital | 1000 |
국제단위계에서 킬로 · 메가 · 기가 같은 접두어는 10의 거듭제곱만 뜻합니다. 1 킬로비트는 1000 비트이지 1024 비트가 아닙니다. 국제단위계는 이 접두어를 2의 거듭제곱 뜻으로 쓰지 말라고(should not) 합니다.
2의 거듭제곱 쪽에는 이름이 새로 섰습니다. 1024 는 키비, 1024 의 제곱은 메비, 세제곱은 기비입니다. 이 이진 접두어는 국제전기기술위원회가 1998년 12월에 승인했습니다. 미국 국립표준기술연구소는 이진 접두어가 국제단위계의 일부가 아니라고 덧붙입니다.
반도체 메모리 쪽 킬로는 1024 입니다. JEDEC 용어 사전에서 반도체 저장 용량 앞의 킬로는 1024, 메가는 1,048,576 입니다. 이 2의 거듭제곱 정의는 흔한 쓰임을 반영하려고 넣었을 뿐이라고 사전 스스로 밝힙니다. 같은 대목에는 이 쓰임이 자주 혼란을 낳아 권하지 않는다는 단위 표준 SI 10-1997 의 문장도 실려 있습니다.
메가바이트는 값이 셋까지 갈립니다. 컴퓨터 메모리를 말할 때는 제조사 대부분이 1,048,576 바이트로 씁니다. 저장 장치 제조사는 대개 1,000,000 바이트로 씁니다. 「1.44 MB」 3.5인치 디스켓의 메가바이트는 셋째 값인 1,024,000 바이트입니다.
여담
byte 의 철자에는 사연이 있습니다. 1962년에 나온 Stretch 설계 책 Planning a Computer System 은 이 낱말을 「한 입」이라는 뜻의 bite 에서 지었다고 적습니다. 실수로 bit 로 바뀌어 적히는 일을 막으려고 철자를 y 로 바꿨다고도 덧붙입니다. 이 책을 엮은 Werner Buchholz 는 컴퓨터 잡지 『바이트』 1977년 2월호에 보낸 편지에서 이 말이 처음 나온 기록을 1956년 6월의 내부 메모로 꼽았습니다.
관련 항목
바이트를 이루거나 바이트가 모여 이루는 크기 단위
비트 · 니블 · 옥텟 · 워드 · 비트열 · 킬로바이트 · 캐시 라인 · 페이지
바이트 크기의 배수를 정하는 단위 표준
SI 접두어 · 이진 접두어 · 키비바이트 · 국제단위계 · IEC 80000-13 · JEDEC
바이트를 여덟 비트로 굳힌 기계와 언어
IBM Stretch · System/360 · C 언어 · CHAR_BIT · sizeof
바이트 여럿을 늘어놓는 차례를 정하는 규칙
엔디언 · 네트워크 바이트 순서 · 바이트 순서 표시 · 정렬 · 패딩
바이트를 사람이 읽는 표기로 바꾸는 방법
16진수 · 이진수 · 헥사 덤프 · base64 · 비트 마스크
글자를 바이트로 옮기는 인코딩
ASCII · UTF-8 · 유니코드 · 문자 인코딩 · 코드 포인트
바이트 단위로 번호를 매기는 저장 공간
메모리 · 메모리 주소 · 주소 · 오프셋 · 레지스터 · 디스크 · 섹터
바이트 묶음을 실어 나르는 통신 단위
패킷 · 프레임 · 헤더 · 페이로드 · 스트림 · 프로토콜
바이트 안의 비트를 직접 다루는 연산
비트 연산 · 시프트 · 마스킹 · 패리티 비트 · 체크섬
바이트로 값을 담는 자료형
정수 · 부동소수점 · 문자열 · 바이트 배열 · 불리언
다른 이름: byte