본문 바로가기

Programming/Codeup.kr기초100제 && 컴퓨터 이야기

[기초-데이터형] 정수 한 개 입력받아 그대로 출력하기3 && Y2K, 2038년 버그

Y2K는 Year 2000 Problem으로 밀레니엄 버그이다. 여기서K가 1000을 의미한다. 1999년 당시 2000년이 되면 세상이 망한다는 흉흉한 소식이 돌고 있었다. 미디어 매체 역시 암울한 내용과 관련되어 이야기를 만들었다. 이 때 Y2K버그 소문이 돌게 되었다. 이 버그는 당시 몇몇 컴퓨터들이나 프로그램들이 메모리를 줄이기 위하여 년도 표기를 2진수로 하였는데, 날짜를 MM-DD-YY로 표기를 썼다. (M은 Month D는 Day Y는 Year이다.) 예를 들어 1983년 2월 27일이라면 02-27-83으로 표기가 된다. 여기서 문제가 발생하였는데, 2000년이 넘어가면 00부터 세서 컴퓨터가 1900년인지 2000년인지 알 수가 없다는 것이다. 이 문제는 별것 아닌것 같지만, 금융시장의 돈이 몇십년치가 더 계산된다던가 예비군을 마친 남성들이 미필자로 구별되는 등 수 많은 버그를 낳는다는 소문이 돌았다. 또 당시 상황이 상황인지라 핵전쟁이 일어난다던가 모든 컴퓨터가 마비된다는 도시괴담까지 돌았다. 이에 대규모 기업들과 금융시장들이 이 문제를 해결하기 위해 돈을 많이 쏟았다. 이런 시장들은 대개 프로그램이 문제없이 잘 굴러가면 몇십년 전 프로그램을 유지하고 쓰는 경우가 있기 때문에 몇십년 전 고용했다가 은퇴한 프로그래머들을 비싼 돈을 주고 복귀 시켜 다시 만들었다. 1999년 12월 31일 밤 한 세기가 넘어가는 역사적인 순간임에도, 불안에 떨며 오류가 나는지 안나는지 지켜보게 만들었다.


 결론적으로는, 그 당시에도 오래된 컴퓨터들만 이런 버그를 가지고 있었고, 대규모 기업들도 미리 준비를 했기 때문에, 큰 피해가 없었다. 그로부터 1년이 지난 2001년에 컴퓨터가 1901년이라 인식해 조금 문제가 되었지만, 금방 버그가 잡혔다. 단지, 세기말에 사람들이 너무 불안해하여 소문이 확대 해석되고, 매체나 판매업체에서도 관련 상품을 내놓았을 뿐이다. 그 덕에 라면이나 생수같은 생필품 판매업체는 IMF때 재미를 조금 봤다. 그러나 Y2K버그는 그 만큼 위력을 가진 버그이긴 했으며, 아직도 그 버그가 존재하는데 2014년 미국에서 100년전 출생자에게 징병통지편지가 보내졌다.


이와 비슷하게 2038년 버그가 있다.


2038년 버그는 유닉스 시간에 32비트 정수형을 쓰는 모든 컴퓨터(휴대폰, 네비게이션, ATM)의 시계가 2038년 1월 19일 3시 14분 7초(한국은 2038년 1월 19일 12시 14분 7초)가 지나면 음수가 적용되어 1901년 12월 13일 20시 45분 52초나 오버플로우 오류를 감지하고 초기값인 1970년 1월 1일 0시 0분 0초로 돌아가게 되는 버그이다. 이 문제는 현재 많은 기기들이 이 방식을 쓰고 있으므로 업데이트가 어려워 많은 문제가 생길 것이라고 예상되어 진다.

 전전글에 정수를 표현할때 int를 쓰면 2^31-1인 2,147,483,647까지 저장할 수 있다고 했다. 시간을 나타내는 변수는 32비트 크기변수이기에 이를 넘어가면 오류가 생기는 것이다. 이전 포스팅에 올린 Unsigned int를 쓰면 음수부분 없이 2^32-1인 4,294,967,295 까지 증가하기에 2106년까지 저장할 수 있다. 현재 가장 나은 차선책은 64비트 정수형을 쓰는건데 이 방법은 2922억 7702만 6586년 12월 4일 15시 30분 8초 까지 연장된다. 태양의 수명이 123억년이니 '지구의 컴퓨터'는 문제가 발생하지 않는다.

문제 설명

정수 한 개를 입력받아 그대로 출력해보자.
(단, 입력되는 정수의 범위는 –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 이다.)

입력

정수 한 개가 입력된다.
(단, 입력되는 정수의 범위는 –9223372036854775808 ~ 9223372036854775807 이다.)

출력

입력된 정수가 그대로 출력된다.

입력 예시

-2147483649

출력 예시

-2147483649

도움말

-2147483648 ~ +2147483647 범위의 정수를 저장하고 처리하기 위해서는 int 데이터형을 사용해 변수를 선언하면된다.
(int 로 선언하고 %d나 %i 로 입력 받거나 출력하면 된다.)

하지만 이 범위를 넘어가는 정수를 저장하기 위해서는 보다 큰 범위를 저장할 수 있는 다른 데이터형을 사용해야 정상적으로 저장시킬 수 있다.

long long int 데이터형을 사용하면 –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 범위의 정수를 저장할 수 있다.

[예시]

long long int n;
scanf("%lld", &n);
printf("%lld", n);