GONGON の無線日誌

jm1wbb.exblog.jp

160m から 2m まで DX 追っかけ生活の悲喜交々

2038 年問題:アップルが考える人類の寿命 (笑

すいぶん前に IT 機器の 2000 年問題というのがあった.下2桁でしか年数をカウントしていないプログラムが 2000 年になった途端に 0 年に戻ってしまい不慮の不具合を起こす,というあれだ.当日の大晦日は会社で徹夜,全ての主要顧客での正常稼働を確認ののち,朝から会社でお節とお屠蘇(おとそ)をいただいてから帰ったのが懐かしい.

ところで 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 世紀(笑
[PR]
by JM1WBB | 2012-10-13 23:43 | IT
ブログトップ