2038년 문제: 컴퓨터의 시간이 멈추는 날
요약: 32비트 시스템의 시간 변수(time_t)가 2038년 1월 19일 03시 14분 07초(UTC)에 한계에 도달하여, 1초 뒤 1901년으로 회귀하는 현상입니다.
1. 수학적 증명
리눅스/유닉스 시스템은 시간을 1970년 1월 1일 00:00:00 (UTC)부터 흐른 '초(Second)'로 계산합니다.
- 데이터 타입:
signed 32-bit integer(부호 있는 32비트 정수) - 표현 범위: $-2^{31} \sim 2^{31}-1$
최대값 계산
32비트 중 맨 앞 1비트는 부호(Sign)로 사용되므로, 실제 데이터는 31비트입니다.
$$ \text{Max Time} = 2^{31} - 1 = 2,147,483,647 \text{ seconds} $$
이 21억 초를 날짜로 환산하면 2038년 1월 19일 03:14:07 UTC가 됩니다.
2. 오버플로우 메커니즘
이 시점에서 1초가 더 흐르면 정수 오버플로우가 발생합니다.
| 시각 (UTC) | 10진수 값 | 2진수 비트 패턴 (32-bit) | 상태 |
|---|---|---|---|
| 03:14:07 | 2,147,483,647 |
0111 1111 1111 1111 1111 1111 1111 1111 |
Max (+) |
| + 1초 | |||
| 03:14:08 | -2,147,483,648 |
1000 0000 0000 0000 0000 0000 0000 0000 |
Min (-) |
결과: 부호 비트가 0(+)에서 1(-)로 바뀌면서, 시스템은 이를 1901년 12월 13일 20:45:52 UTC로 인식합니다. (과거로 시간 여행)