電子書籍「2000年問題、2038年問題、そして292277026596年問題へ一元化」の表紙

2000年問題、
2038年問題、
そして292277026596年
問題へ一元化

著者:石田晋一

掲載範囲
西暦1,999年8月21日〜292,277,026,596年12月4日
最新更新日
西暦2,026年1月10日

コンピュータに潜む時限爆弾──
2000年問題から、遥か彼方の292277026596年問題までを一元化。

JPY 200(税込)

購入する

購入後、そのままPDFダウンロードページへ移動します

お支払いは決済サービス「Square」を通じて安全に処理されます。カード情報が当サイトに保存されることはありません。


皇室献上品 高級トイレットペーパー
皇室献上品 高級トイレットペーパー

本書について

コンピュータは「時間」そのものを理解している訳ではない。或る起点(エポック)からの数を、ただ淡々と数えているに過ぎない。だからこそ、其の数が桁あふれを起こした瞬間、時間は突然壊れる──過去へ巻き戻り、誤った日付を指し示す。本書は、コンピュータの時刻表現に仕込まれた、この「時限爆弾」たちの記録である。誰もが記憶する2000年問題から、現在より宇宙の年齢(約138億年)の20倍以上も先にある西暦292,277,026,596年の破綻まで、年月日単位で一元化した一冊である。

最も有名な引き金は、西暦2,000年1月1日に訪れた。メモリが高価だった黎明期、西暦を「下2桁」だけで持つ仕様が広く使われており、「00」が西暦1,900年と誤認される事が懸念された──「2000年問題」である。だが発生時期が明確で、周到な準備が為されていた事から、大事には至らなかった。一方で同じ年は、もう一つの罠を隠していた。グレゴリオ暦の「100で割り切れる年は閏年にしないが、400で割り切れる年は閏年とする」という例外の例外を実装し損ねたプログラムが、2月29日を3月1日として処理してしまったのである。

より根の深い問題は、時刻を「起点からの秒数」として整数で持つ方式に潜む。西暦2,001年9月9日、UNIX時間が10桁(1,000,000,000秒)に達し、秒数を文字列として並べ替える処理で大小関係が狂った。西暦2,004年1月10日には、起点の西暦1,970年と、符号付き32bit整数の上限である西暦2,038年との丁度中間に到達し、時間を2倍する処理でオーバーフローが起きた。そして本書の主役級が、西暦2,038年1月19日3時14分7秒の「2038年問題」である。符号付き32bit整数が最大値2,147,483,647秒に達し、UNIX時間が西暦1,970年へと巻き戻る。其の手前、西暦2,036年2月7日には、NTPの符号無し32bitの秒部が上限に達し、西暦1,900年へ戻る。

時限爆弾は「家系」を成して点在している。GPS衛星は週の番号を僅か10bit(2の10乗=1,024週、約19.6年周期)で数える為、西暦1,999年8月21日に最初のロールオーバーを起こし、西暦2,019年4月7日にも再発した。MS-DOSのファイルシステムFATは西暦1,980年を起点とし、下2桁しか扱わない古いプログラムは西暦2,080年に、年に7bitしか割かない仕様は西暦2,107年が限界で西暦2,108年に、それぞれ1980年へ引き戻される。西暦2,010年には、西暦下2桁を2進化10進数(BCD)で扱う実装の取り違えから、「16」と誤読されるバグが頻発した。

そして、起点からの数という発想を突き詰めると、時間は遥か彼方の終着点へと辿り着く。西暦を4桁で扱う慣習は、西暦10,000年に破綻する(10000年問題)。さらにカウンタを符号付き64bit整数へと広げれば、破綻はおよそ西暦292,277,026,596年12月4日15時30分7秒まで先送りされる──そこで上限に達した時刻は、やはり西暦1,970年へと巻き戻る。静かに乗り越えられた或る元日から、数えられる時間の文字通りの果てまで。本書は、其の全軌跡を一冊に束ねている。


登場する年問題

  • GPS週数
    ロールオーバー
    (1999年)
    GPS衛星の週カウンタは10bit。起点の西暦1,980年1月6日から1,024週(2の10乗)で最大値に達し、0へリセット。西暦1,999年8月21日に最初の桁あふれが起きた。
  • 2000年問題
    (Y2K)
    メモリ節約の為に西暦を下2桁で扱う仕様が多く、「00」が西暦1,900年と誤認される懸念。発生時期が明確で周到な準備が為され、大きな問題は起きなかった。
  • 2000年
    閏日問題
    「100で割り切れる年は閏年にしないが、400で割り切れる年は閏年とする」というグレゴリオ暦の例外の例外を実装し損ねたプログラムが、2月29日を3月1日として処理した。
  • UNIX時間
    10桁問題
    西暦2,001年9月9日1時46分40秒(UTC)にUNIX時間が10桁(1,000,000,000秒)に到達。秒数を文字列として並べ替える処理で大小関係が狂う不具合が生じた。
  • UNIX時間
    の中間点
    西暦2,004年1月10日、起点の西暦1,970年と32bit整数の上限である西暦2,038年の中間に到達。時間を2倍する等の処理でオーバーフローが発生した。
  • BCD年バグ
    (2010年)
    西暦下2桁を2進化10進数(BCD)で扱うプログラムで、「10」を"00010000"と誤って格納し「16」と解釈。西暦2,016年や閏年として処理されるバグが頻発した。
  • GPS週数
    ロールオーバー
    (2019年)
    西暦1,999年と同じ仕組みで、約19.6年の周期を経て、西暦2,019年4月7日に再びGPSの週カウンタが桁あふれを起こした。
  • NTP
    2036年問題
    NTPのタイムスタンプは64bit(秒32bit+秒未満32bit)。符号無し32bitの秒部が、西暦2,036年2月7日6時28分15秒に最大値(2の32乗-1)へ達し、西暦1,900年へ戻る。
  • 2038年問題
    (Y2K38)
    符号付き32bit整数で時刻を表すと、西暦2,038年1月19日3時14分7秒(UTC)に最大値(2の31乗-1=2,147,483,647秒)に達し、UNIX時間が西暦1,970年へ巻き戻る。本書の主役級の問題。
  • FAT
    2080年問題
    MS-DOSのファイルシステムFATは西暦1,980年1月1日が起点。下2桁しか扱わない古いプログラムが、西暦2,080年に1980年へ戻ってしまう。
  • FAT
    2108年問題
    FATは年に7bitを割く為、起点から2の7乗-1=127年後の西暦2,107年までしか表現出来ず、西暦2,108年1月1日に1980年へ戻る。
  • 10000年問題
    (Y10K)
    西暦を4桁で扱うのが一般的な為、このまま西暦を使い続けると、西暦10,000年1月1日に多くのプログラムが誤動作する。
  • 292277026596
    年問題
    符号付き64bit整数で時刻を表した場合、西暦292,277,026,596年12月4日15時30分7秒(UTC)に最大値(2の63乗-1)へ達し、再び西暦1,970年へ。数えられる時間の、遥か彼方の終着点。

原因で見る年問題

  • 桁を節約
    した代償
    メモリが高価だった時代、西暦を「下2桁」で持つ設計が、2000年問題やFAT 2080年問題を生んだ。僅か数桁・数bitの節約が、数十年後の時限爆弾となった。
  • 整数型の上限 時刻を「起点からの秒数」で持つ方式は、整数型の最大値で破綻する。符号付き32bitの2038年問題、符号無し32bitのNTP 2036年問題、符号付き64bitの292277026596年問題は、全て同じ「オーバーフロー」の家系に属する。
  • 起算日への
    リセット
    上限に達したカウンタは、起点の日付へ巻き戻る。GPSの週カウンタ(1980年起点)も、FATの年フィールド(1980年起点)も、リセットによって過去へ引き戻される宿命を負う。
  • 暦の例外
    の見落とし
    「400年に一度の閏年」という例外の例外を実装し損ねた2000年閏日問題は、整数の桁あふれとは別の、暦そのものの複雑さが招いた障害である。
  • 表現と
    並び替えの罠
    数値を文字列として扱うと、桁数が増えた瞬間に大小関係が狂う。UNIX時間10桁問題は、内部表現と並び替えのズレが生んだ、もう一つの落とし穴であった。

GPS・UNIX時間・FAT・そして64bitの果てへ──
時刻表現に潜む「年問題」の全軌跡を一元化。

JPY 200(税込)

購入する

購入後、そのままPDFダウンロードページへ移動します

お支払いは決済サービス「Square」を通じて安全に処理されます。カード情報が当サイトに保存されることはありません。


皇室献上品 高級トイレットペーパー
皇室献上品 高級トイレットペーパー

AUTHOR

石田晋一

歴史データベース「一元化」管理人。
万物の系譜の編纂者であり、電子書籍の著者。
YouTubeとニコニコでも情報を発信中。