みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

2038年問題

UNIX系システムで2038年問題ってありますよね。
要はカウンタのオーバーフローが問題なわけですが、
このカウンタは32bitの符号ありですよね。
なぜ符合「あり」のカウンタにしたんでしょうか?

投稿日時 - 2010-03-14 09:58:30

QNo.5750540

暇なときに回答ください

質問者が選んだベストアンサー

当初のUNIXの設計としては、
・基本のデータ型が「32bit符号付整数」だった
・時刻値に、わざわざ符号無し整数という特殊なデータ型にするメリットを見いだせなかった(設計当時は、2038年にオーバーフローするのをそれほど問題視していなかった)
からでしょう。

UNIXを元にした「標準C言語ライブラリ」の「time関数」では、
1970年を起点とした時刻を返すため、32bit符号付整数の場合は2038年にオーバーフローするわけですが
このtime関数は「エラーの時-1を返す」ことで、エラー値と正しい時刻値を区別するようになってますので、
単純に「時刻は符号無し整数」に変更することはできません。
無駄が多いですが、符号付として意味がある仕様になってます。

まあ、先見の明がなかったと言ってしまえばそれまでですが、
それを言うと、ファイルサイズなんかも元々は32bitで、2GB超のファイルの取り扱いができないという問題もありました。
時刻だけの問題ではありません。

また、最近のUNIX系システムでは、32bit系でも、
時刻型(time_t)は64bitにしてますので、それを適切に扱えば、
2038年にオーバーフローすることはありません。
「time_tを32bitとして処理するようなプログラムをそのまま動かし続ける」場合のみ問題になります。

逆に、2038年問題はUNIX系システムだけの問題ではありません。
上述の通り、この時刻は「C言語の標準仕様」として定められていますので、
その仕様に基づいて作られたようなプログラムであれば、
time_t が32bitのシステムであったり、64bitのシステムでもアプリケーション側で32bitで扱ってたりすると、
UNIX以外でも2038年問題が発生します。

投稿日時 - 2010-03-14 11:40:18

お礼

詳しいご回答ありがとうございます。
符号あり というのは意味があったんですね。

先見の明なしといえばY2K問題もそうだったですね。
7990年後に10000年問題は起きるんでしょうか?

投稿日時 - 2010-03-14 14:10:43

ANo.2

このQ&Aは役に立ちましたか?

14人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

PDP-11の実装の問題だからじゃないのかなぁ、32bitの実装が特殊とか。

投稿日時 - 2010-03-14 11:26:39

あなたにオススメの質問