비트 8개가 모이면 1바이트이고, 정수 타입은 “몇 바이트를 쓰는지”에 따라 범위가 결정됩니다.
대부분의 컴퓨터는 2의 보수로 음수를 표현합니다.
(signed 정수에서) 가장 왼쪽 비트는 흔히 부호 비트(sign bit)로 해석됩니다.
1바이트(8비트) signed 기준으로 보면:
비트: b7 b6 b5 b4 b3 b2 b1 b0
값 : (부호/가중치) +64 +32 +16 +8 +4 +2 +1
01111111 = 12710000000 = -128 양수 N을 음수 -N으로 바꾸는 방법(2의 보수):
예: (43 -43) (8비트 예시)
43 = 00101011
반전 = 11010100
+ 1 = 11010101 (= -43)
| 진법 | 설명 | 코드 |
|---|---|---|
| 2진법 | 0, 1만 사용 | 0b1100 |
| 10진법 | 일상 사용 | 기본 |
| 16진법 | 2진법과 궁합 (4비트=1자리) | 0xF |
16진수는 “비트를 사람이 읽기 쉽게 압축한 표기”라고 생각하면 편합니다.
예: 0x2B는 2진수로 0010 1011, 즉 10진수 43입니다.
0x2B
= 0b0010 1011
= 32 + 8 + 2 + 1
= 43
대표적인 두 가지 상황:
short에 30000 + 20000 → 50000이 아니라 엉뚱한 값int → short로 대입하면 범위를 벗어나는 순간 다른 숫자가 됨참고: C++에서 signed 정수 오버플로우는 표준상 정의되지 않은 동작(UB)입니다.
실전에서는 “대부분 2의 보수로 래핑되는 것처럼 보일 수 있지만”, 믿고 쓰면 위험합니다.
int 범위(약 21억)를 넘어가는 입력에서 정답이 틀리기 쉬움 → long long이 필요한 전형적인 케이스0x2B가 왜 43인지 스스로 계산할 수 있나?int를 쓰면 어떤 종류의 문제가 생길까?