앞서 변수와 메모리의 기초 단위(Bit, Byte)를 알아보았다. 이번 글에서는 정수형 자료형이 데이터를 표현하는 두 가지 방식인 부호 있는 정수(Signed) 와 부호 없는 정수(Unsigned), 그리고 컴퓨터가 음수를 처리하는 원리인 2의 보수(2's Complement)를 정리한다.
1. Unsigned와 Signed: 부호의 유무
1바이트(8비트)는 총 가지의 상태를 표현할 수 있다. 이 256가지의 상태를 어떻게 해석하느냐에 따라 표현 범위가 완전히 달라진다.
unsigned char u = 255; // 0 ~ 255
signed char s = -1; // -128 ~ 127 (signed 키워드는 생략 가능)
- Unsigned (부호 없음): 256가지 상태를 오직 0과 양수에만 배정한다. (범위: )
- Signed (부호 있음): 256가지 상태를 음수와 양수에 절반씩 나누어 배정한다. (범위: )
2. MSB(최상위 비트)와 부호 판별
Signed 자료형에서는 8개의 비트 중 가장 왼쪽에 위치한 비트를 MSB(Most Significant Bit, 최상위 비트)라고 부른다.
- MSB가
0인 경우: 양수로 해석한다. - MSB가
1인 경우: 음수로 해석한다.
즉, MSB는 해당 숫자가 양수인지 음수인지 판별하는 '부호 비트'의 역할을 수행한다.
3. 컴퓨터가 음수를 표현하는 방식: 2의 보수
컴퓨터는 뺄셈을 전용으로 처리하는 회로를 따로 두지 않고, "음수의 덧셈"으로 처리하여 연산 속도를 최적화한다. 그렇다면 컴퓨터는 음수를 어떻게 정의할까?
음수의 정의: 어떤 양수 와 더했을 때 이 되는 수
8비트 공간에서 1(0000 0001)과 더해서 0을 만들 수 있는 비트 패턴은 모든 비트가 1로 채워진 1111 1111이다.
Plaintext
0000 0001 ( 1)
+ 1111 1111 ( -1)
-------------------
1 0000 0000 -> 8비트 공간을 넘어선 맨 앞 1은 버려지고 '0000 0000'(0)이 됨
따라서 1111 1111은 Signed 기준 -1을 의미한다.
2의 보수 구하는 방법
어떤 양수에 대응하는 음수 비트를 찾는 방법은 매우 간단하다.
-
모든 비트를 반전시킨다. (
0->1,1->0) -
결과에
1을 더한다.
4. 메모리는 하나, 해석은 두 가지
동일한 메모리 공간에 동일한 비트(1111 1111)가 저장되어 있어도, 개발자가 선언한 자료형에 따라 컴퓨터가 해석하는 값이 달라진다.
-
unsigned char로 해석 시:255 -
signed char로 해석 시:-1
비트 데이터 자체는 동일하지만, 자료형이라는 '설명서'에 따라 전혀 다른 값으로 읽히는 것이다.
5. 정수형 자료형의 크기와 실무에서의 주의점
비트 수가 늘어날수록 표현 가능한 수의 범위는 기하급수적으로 증가한다.
| 자료형 | 크기 | Unsigned 표현 범위 | Signed 표현 범위 |
|---|---|---|---|
| char | 1 바이트 (8 비트) | ||
| short | 2 바이트 (16 비트) | ||
| int | 4 바이트 (32 비트) |
💡 게임 개발 시 자료형 선택이 중요한 이유
고전 게임에서 캐릭터 스탯이나 아이템 최대 수량이 255로 제한되어 있던 이유는 1바이트(
char) 자료형을 사용했기 때문이다.만약 현대 게임에서 몬스터의 HP를
4바이트 Signed int로 설정해 두었는데, 파워 인플레이션으로 인해 HP가 21억을 넘어서는 순간 오버플로우가 발생하여 HP가 음수(-21억)로 변해버리는 치명적인 버그가 발생할 수 있다.
따라서 담고자 하는 데이터의 최댓값을 고려하여 적절한 크기(int, long long 등)와 부호 키워드(unsigned)를 선택하는 것이 중요하다.
마무리하며
동일한 이진수 데이터라도 어떤 자료형으로 바라보느냐에 따라 전혀 다른 의미를 가진다. 자료형의 한계 범위를 명확히 인지하고 코드를 작성하는 습관을 들이도록 하자.