• ベストアンサー

2038年問題

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

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

当初の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年問題が発生します。

takalin
質問者

お礼

詳しいご回答ありがとうございます。 符号あり というのは意味があったんですね。 先見の明なしといえばY2K問題もそうだったですね。 7990年後に10000年問題は起きるんでしょうか?

その他の回答 (1)

回答No.1

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

関連するQ&A