반응형
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비트 정수형으로 이루어진 초 부분이 범위를 벗어나게 되고 결국 오버플로 현상이 나타나게 된다는 것이다.
물론 해결 방법은 있다.
- 32비트 부호없는 정수형으로 교체한다.
- 수 표현 범위가 0~4,294,967,295이 되어 나타낼 수 있는 시간의 범위가 1970년부터 136년까지 즉, 약 2106년 까지 나타낼 수 있을 것이다.
- 하지만 이 방법을 쓰게 되면 날짜의 대한 연산이 안되기 때문에 해결 방법으로는 사용할 수 없다.
- 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 생략 가능 |
반응형
'컴퓨터 시스템 이것저것' 카테고리의 다른 글
2진수 8진수 16진수, 32비트 64비트 한번에 정리 (0) | 2022.04.10 |
---|---|
CRLF / LF / CR 차이점 (0) | 2022.03.13 |
최근댓글