2038 年問題:アップルが考える人類の寿命 (笑
ところで C 言語には 2038 年問題というのが存在する.標準的な実装では,時刻を UNIX 時間(1970 年 1 月 1 日 0 時 0 分からの経過秒数)で表す.これで問題になるのはこの秒数を格納している time_t 型変数のバイト数(桁数).手元の環境で確認してみる.
古典的な実装のままの OpenBSD は符号ありの int であり
0x7fffffff: 2147483647: Tue Jan 19 12:14:07 2038
を越えると桁が溢れて負の値になってしまい
0x80000000: -2147483648: Sat Dec 14 05:45:52 1901
と ctime() がメチャクチャな値を返してくる.これが 2038 年問題.
Mac OS X では符号ありの long に拡張されている.そこで適当な値を入れてインクリメントしてみると
0x3afff3c2ef: 253402268399: Fri Dec 31 23:59:59 9999
ここまでは ctime() がご機嫌よく文字列を返してくるが,もう1秒インクリメントすると
0x3afff3c2f0: 253402268400:(null)0x3afff3c2f0: 253402268400:(null)
という結果になった.これは桁溢れではなく
if (time > maxOfLife) { あぼーん: }
というような明示的な実装.
アップルが考える人類の寿命は,西暦 9999 年 12 月 31 日 23 時 59 分.人類滅亡の日まで後 79 世紀(笑