유닉스는 왜 타임 스탬프를 부호있는 정수로 저장합니까?


24

타임 스탬프를 나타내는 데 부호있는 정수가 사용되는 이유는 무엇입니까? 1970 년에 명확하게 정의 된 시작이 0으로 표시되는데 왜 그 앞에 숫자가 필요한가? 음수 타임 스탬프가 어디서나 사용됩니까?


2
그렇기 때문에 노스트라 다무스는 컴퓨터를 사용하여 3000 년 이상의 예측을 기록 할 수 없었습니다. 나는 그들이 그것을 Y3K 버그 또는 뭔가라고 생각합니다!
Jeach

3
고대 로마인들은 연도 수가 음수에서 양수로 바뀌면 훨씬 더 나쁜 문제를 겪었습니다. 숫자 0을 표현할 수 있다면 Y0K 문제라고 불렀을 것입니다. 8-)}
Keith Thompson

답변:


35

C의 초기 버전에는 부호없는 정수가 없었습니다. (일부 프로그래머는 부호없는 산술이 필요할 때 포인터를 사용했습니다.) time()함수 또는 부호없는 유형 중 어느 것이 먼저 왔는지 알지 못하지만 부호없는 유형을 보편적으로 사용할 수 있기 전에 표현이 확립 된 것으로 생각됩니다. 그리고 2038은 미래에 충분히 걱정할 가치가 없었습니다. 그때까지 많은 사람들이 유닉스가 여전히 존재할 것이라고 생각한 것 같습니다.

부호 time_t가 붙은 또 다른 장점은 64 비트 (일부 시스템에서 이미 발생하고 있음)로 확장하면 1970 년 이전의 시간을 나타내는 능력을 잃지 않고 미래에 수 천억 년을 나타낼 수 있다는 것입니다. 32 비트 부호 없음 time_t ; 64 비트로 전환하기에 충분한 시간이 있습니다.)


7
time기능은 신기원보다 오래되었습니다 : 1971 년 1 월 1 일 자정부터 유닉스 v1 (1971 년)은 1/60 초 단위로 계산되었습니다. 그것은 이미이었다 - "생각을 가진 사용자 asecond의 2 ** 60분의 32은 약 2.5 년이므로주의한다. 연대 기적"는 것으로 알려진 버그 unsigned 에 의해 도입 된 1978 년 K & R 1970 시대가 설립 된 후에도.
Gilles 'SO- 악의를 그만두십시오

나는 빠른 테스트와 64 비트 리눅스 박스에서했다. gmtime그리고 localtime2147483647 년에 최대로 (연도 -2147483648을 준 후 다음 초). 따라서 55 비트 이상의 시간을 얻으려면 누군가 부호없는 32 비트 정수 대신 연중 64 비트 정수를 사용하도록 출력 루틴을 업데이트해야합니다. 앞으로 몇십 억 년 안에 누군가가 그 버그를 돌봐 줄 수 있기를 바랍니다.
freiheit

@freiheit : 흥미 롭습니다. 문제는 struct tm유형에 유형의 멤버 tm_year(1900 년 이후 연도를 나타냄)가 있다는 것입니다 int. 64 비트 시스템은 쉽게 64 비트를 가질 수 time_t있지만 일반적으로 32 비트를 갖습니다 int. ( char8 비트이고 int64 비트 인 short경우 16 비트 또는 32 비트 일 수 있으며 다른 크기에 대해 사전 정의 된 유형은 없습니다.) 그러나 실제로는 시스템 수준 지원이 필요한 time()유일한 기능 일 것입니다 <time.h>. time_t값을 사람이 읽을 수있는 문자열 로 변환하는 고유 코드를 작성할 수 있습니다.
Keith Thompson

12

1970 년 1 월 1 일 이전의 타임 스탬프 및 날짜를 ​​지원해야합니다.


1
이것은 지난 1902 년 (1902 년)에 불과합니다.
Bakudan

2
POSIX는 time_t32 비트 일 필요는 없습니다 . 많은 시스템에서 이미 64 비트입니다.
Keith Thompson

1
mktime()-1오류가 발생하면 함수가 반환 되므로 1970-01-01 이전의 정확한 타임 스탬프와 오류 ts를 구분하는 것이 불가능할 수 있습니다. 1970-01-01 이전의 검토 날짜는 금지되어 있습니다
DimG

@DimG : 오류와 특정 타임 스탬프를 구분하기가 어렵습니다 1969-12-31 23:59:59 UTC. -1명확하지 않은 음수 값 입니다.
Keith Thompson

1
@mtraceur : C 표준은 mktime()set 호출 실패를 요구하지 않습니다 errno. (POSIX 않습니다.)
Keith Thompson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.