いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

2036年問題とは

 2036年問題について書きましょう。Windowsでは、Windows2000以降(もちろん今のWindows10なども)、インターネット上のタイムサーバー(あちこちにある。コンピュータで動く、これもソフトウェアです)を利用してパソコンの内部時計を定期的に正しい時刻に修正する、という動作を自動で行うようになりました。タイムサーバーはインターネットに接続しているパソコンとやりとりをして、正しい時刻をパソコンに送信してくれます。その際には「NTP(Network Time Protocol)」というプロトコル(どんな書式で時刻を教えてくれるのか、どういうタイミングで時刻をもらえるのか、などのルール)が利用されます。このNTPでは、西暦1900年1月1日0時(世界時)から現在までの経過秒数を得られることになっています。ネットワークから正確な時刻を取得して現在の日時を求めようとする人(プログラマ)はこの秒数から年、月、日、時、分、秒を計算するのです。もちろん途中に閏年なんかもあるし、注意が必要です。さて、NTPではこの秒数を32ビット(0,1の並びで32桁)の数値で表現することになっています。「ビット」って、聞いたことはあっても詳しくは知らない人が多いでしょう。例えば、4ビットで1111は2^{3} + 2^{2} + 2 + 1 = 15 を表すし、6ビットで101011は2^{5} + 2^{3} + 2 + 1 = 43 を表します。こんな0、1の32個の列がタイムサーバーから送られてくるわけです。もしタイムサーバーから000…000101011(32桁)が送られてきたら、1900年1月1日0時から43秒経っています、ということになります。11111…111(32桁全部が1)だったら? 2^{31} + 2^{30} + 2^{29} + ……  + 2^{2} + 2 + 1等比数列の和)=4294967295秒(42億9496万7295秒)です。実はこれが西暦2036年2月6日 6時28分15秒(世界時。日本時間で15時28分15秒)なのです。NTPでは先に書いたように、秒を32ビットで表すので、そこから1秒先、6時28分16秒になると時刻を正しく表現できなくなります(32ビット分しか秒のために用意されていない。すると多分桁上がりであふれてしまって0秒、となるかな……)。そしてパソコン側では、「タイムサーバーからは32ビットの時刻が送られてくる」という前提で書かれたプログラムはヘンな動きをすることになります。2000年問題の時みたいに、そういうプログラムが人命に関わるところで使われているかも知れず、安全性の確認をしなければなりません。タイムサーバー側でも受信側でも対応しなければならず、またしても大変でしょう……。これが2036年問題。いろいろあるなあ……。