[컴퓨터 시스템] 5. 데이터는 왜 결국 비트로 표현될까
3편에서 메모리 주소를, 4편에서 실행 상태를 봤다면 이제 그 메모리 안에 실제로 무엇이 들어 있는지 봐야 합니다. 사람이 정수와 문자와 색과 포인터를 서로 다른 종류의 값처럼 느껴도, 컴퓨터는 결국 비트열을 해석하는 방식으로 그것들을 다룹니다.
이번 글은 비트 표현의 첫 관문입니다. 2진수와 16진수, signed와 unsigned, overflow를 따로따로 외우지 않고 '같은 비트열을 어떻게 읽느냐'라는 하나의 질문으로 묶어보겠습니다.
- 왜 모든 데이터가 결국 비트열로 저장된다고 말하는지
- 2진수와 16진수를 같이 보는 이유
- 같은 비트열이 signed와 unsigned에서 다르게 읽히는 이유
- 2의 보수 관점에서 음수 표현을 이해하는 방법
- overflow가 단순히 숫자가 커지는 현상이 아닌 이유
1. 데이터가 결국 비트라는 말은 무슨 뜻일까
메모리 안에서는 정수도, 문자도, 포인터도 결국 0과 1의 패턴으로 저장됩니다. 차이는 그 비트열 자체보다, 그 비트열을 어떤 규칙으로 해석하느냐에 있습니다.
이 관점을 먼저 잡아두면 뒤에서 엔디안, 부동소수점, 어셈블리까지 이어질 때도 핵심 질문이 변하지 않습니다. 지금 보는 비트열을 어떤 형식으로 읽고 있는가가 중심 질문입니다.
| 겉으로 보는 값 | 메모리 안에서 | 중요한 질문 |
|---|---|---|
| 정수 13 | 비트 패턴 | 이 패턴을 어떤 수 체계로 읽는가 |
| 문자 A | 비트 패턴 | 어떤 문자 인코딩 규칙으로 읽는가 |
| 포인터 | 비트 패턴 | 이 패턴을 주소로 읽는가 |
2. 2진수와 16진수는 같이 보는 편이 훨씬 낫다
2진수는 실제 비트 의미를 드러내기에 좋고, 16진수는 긴 비트열을 짧게 읽기에 좋습니다. 시스템 공부에서 둘을 함께 쓰는 이유는 계산 편의와 표현 충실도를 동시에 잡기 위해서입니다.
특히 4비트가 16진수 한 자리와 정확히 대응된다는 사실을 익혀두면, 긴 메모리 덤프를 볼 때도 훨씬 덜 막막합니다.
| 10진수 | 2진수 | 16진수 |
|---|---|---|
| 10 | 1010 | 0xA |
| 13 | 1101 | 0xD |
| 255 | 11111111 | 0xFF |
3. 같은 비트열도 signed와 unsigned에서 값이 달라진다
중요한 건 비트열이 달라지는 것이 아니라 해석 규칙이 달라진다는 점입니다. 예를 들어 8비트 패턴 11111111은 unsigned로 읽으면 255지만, signed 2의 보수로 읽으면 -1이 됩니다.
즉 컴퓨터는 '이건 양수 패턴이다' 같은 태그를 비트 안에 따로 넣는 것이 아니라, 우리가 어떤 형으로 읽느냐에 따라 같은 패턴이 다른 의미를 가질 수 있습니다.
| 비트열 | unsigned 해석 | signed 해석 |
|---|---|---|
| 01111111 | 127 | 127 |
| 11111111 | 255 | -1 |
| 10000000 | 128 | -128 |
4. 2의 보수는 음수를 표현하는 계산 규칙이다
2의 보수는 처음엔 마법처럼 보이지만, 실제로는 덧셈 하드웨어를 크게 바꾸지 않고 음수를 표현하기 위한 규칙으로 이해하는 편이 좋습니다. 비트를 뒤집고 1을 더하는 기계적 규칙을 외우기보다, 왜 그런 표현이 유용한지 보는 쪽이 더 오래 갑니다.
핵심은 양수와 음수를 같은 덧셈 장치 위에서 다루기 쉽도록 표현 체계를 맞춘다는 데 있습니다.
5. overflow는 숫자가 커졌다가 아니라 표현 범위를 넘었다는 뜻이다
overflow를 단순히 값이 너무 커졌다고 이해하면 절반만 이해한 셈입니다. 정확히는 현재 비트 수와 현재 해석 규칙 안에서 표현 가능한 범위를 넘어서며 결과 해석이 달라지는 현상입니다.
그래서 overflow는 수학이 틀린 것이 아니라 표현 모델의 한계가 드러나는 장면입니다.
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint8_t a = 255;
printf("%u\n", (uint8_t)(a + 1));
return 0;
}6. 이 감각이 실제 코드에서 바로 필요한 장면
signed와 unsigned가 섞인 비교, 좁은 정수형으로의 캐스팅, 네트워크 패킷 파싱, 메모리 덤프 읽기 같은 장면에서는 비트 표현 감각이 바로 필요합니다. 이론처럼 보이지만 실제 코드를 읽을 때도 계속 등장하는 기반입니다.
| 장면 | 왜 비트 표현 감각이 필요한가 |
|---|---|
| 형 변환 | 같은 비트열이 다른 규칙으로 읽힐 수 있다 |
| 메모리 덤프 | 16진수 패턴을 값으로 다시 해석해야 한다 |
| 버그 분석 | overflow와 범위 초과를 눈치채야 한다 |
7. 직접 해볼 문제: 이 비트열은 어떻게 읽을까
핵심은 비트 자체보다 해석 규칙을 먼저 정하는 데 있습니다.
이번 글에서 기억할 것
스스로 점검
다음 글 예고
다음 글에서는 멀티바이트 값이 메모리에 놓이는 순서, 즉 엔디안을 보면서 같은 값이 바이트 수준에서 어떻게 달라 보일 수 있는지 정리합니다.
'학습 자료 글 > 컴퓨터시스템' 카테고리의 다른 글
| 컴퓨터시스템 기초 7. 왜 실수는 10진수처럼 정확하게 저장되지 않을까 (0) | 2026.03.31 |
|---|---|
| 컴퓨터시스템 기초 6. 바이트 순서는 왜 값을 다르게 보이게 만들까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 4. 디버거는 실행을 보는 창이다 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 3. 포인터와 메모리를 같이 이해해야 하는 이유 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 2. C는 왜 시스템의 입구가 되는가 (0) | 2026.03.31 |