반응형

2038년 1월 19일 3시 14분 7초 에 32비트 운영체제를 비롯해 시간을 사용하는 모든 응용 프로그램은 오류가 발생할 것이다. 

유닉스 운영체제의 시작 시간은 1970년 1월 1일 0시로 되어 있고, 이 시간을 시작으로 0부터 초를 세면서 시간을 측정해왔다.

초기 시간부터 특정 날짜까지인 "68년 18일 3시간 14분 7초" 시간이 흐르면 모든 32비트 운영체제에서 오류가 발생하게 되는데 그 이유를 알아보자.

 

먼저, 위 시간을 초로 바꾸어보면, 

2145916800 + 1555200 + 10800 + 840 + 7 = "2,147,483,647" 어디서 많이 봤던 수이다.

바로 32비트의 최대 정수 범위인데 운영체제에서는 초를 분과 시간 등으로 나누어 시간을 표시한다.

그러나 시간이 지남으로써 32비트 정수형으로 이루어진 초 부분이 범위를 벗어나게 되고 결국 오버플로 현상이 나타나게 된다는 것이다. 

 

물론 해결 방법은 있다.

  1. 32비트 부호없는 정수형으로 교체한다. 
    • 수 표현 범위가 0~4,294,967,295이 되어 나타낼 수 있는 시간의 범위가 1970년부터 136년까지 즉, 약 2106년 까지 나타낼 수 있을 것이다.
    • 하지만 이 방법을 쓰게 되면 날짜의 대한 연산이 안되기 때문에 해결 방법으로는 사용할 수 없다.
  2. 64비트 운영체제로 모두 교체하고, 초를 다루는 자료형을 64비트 정수 자료형으로 바꾸어 주면 된다.
    • 이게 제일 베스트인 방법이다.
    • 하지만, 자료형의 크기를 바꾸는게 간단한게 아니다 여기저기 시간을 사용하며 구조적으로 얽히고 설켜있어 무슨 오류가 발생할지 모른다.  
    • 64비트 정수 자료형으로 바꿔주게 되면, 나타낼 수 있는 정수의 범위는 9,223,372,036,854,775,807 이기 때문에 초를 연도로 바꾸면, 약 292271023045년 까지는 이상 없이 사용 할 수 있을 것이다.
    • 결국 숫자를 나타낼 수 있는 한계는 여전히 존재하지만 저 년도가 될 때 쯤에는 256비트 운영체제를 사용하고 있지 않을까?

 

char
signed char
1바이트, 8비트 -128~127  
unsigned char 1바이트, 8비트 0~255  
short
short int
2바이트, 16비트 -32,768~32,767 int 생략 가능
unsigned short
unsigned short int
2바이트, 16비트 0~65,535 int 생략 가능
int
signed int
4바이트, 32비트 -2,147,483,648~ 2,147,483,647  
unsigned
unsigned int
4바이트, 32비트 0~4,294,967,295 int 생략 가능
long
long int
signed long
signed long int
4바이트, 32비트 -2,147,483,648~ 2,147,483,647 int 생략 가능
unsigned long
unsigned long int
4바이트, 32비트 0~4,294,967,295 int 생략 가능
long long
long long int
signed long long
signed long long int
8바이트, 64비트 -9,223,372,036,854,775,808~
9,223,372,036,854,775,807
int 생략 가능
unsigned long long
unsigned long long int
8바이트, 64비트 0~18,446,744,073,709,551,615 int 생략 가능

 

반응형