昨日、去年の学園祭委員長と飲んできました アッキーです
実は私、
去年の学園祭副実行委員長なんですね
今年は克兎とか千石さんとかが頑張ってくれるそうです
さて今回は今までと思考を変えて、
子供の頃ある問題で騒いでたけど、なんでだったの?
って言うことを改めて考えてみようと思います
[1回]
ズバリ今回は
2000年問題を振り返ります
約12年前の問題ですね。当時の私は8歳です
そもそも何が問題で騒いでいたのでしょうか?
これは年月日の年の扱いを4桁ではなく下2桁で扱っていたのが
すべての原因なんです
つまり 1999年7月14日 を 99/7/14 と扱っていたのですね
コレが原因で
2000年1月1日 → 00/1/1 → 1900年1月1日 と解釈されてしまうわけですね
データ上の解釈の違いによって例えばある年月日付きのデータを年順に並べた時に
2000年のデータが一番古い扱いになり、順序が狂ってしまう・・・
というのがこの問題の真相です
幸い日本では、消費税の導入や昭和から平成に変わるという大きな事柄のお陰で
1989年にプログラムを全面的に見直す必要があったため
その時に一緒に2000年問題の種も見つけて修正したという事で
あまり大きな問題にはならなかったそうです
さて、ここからプログラム的に問題を掘り下げて行きましょう
そもそもなぜ、年を4桁ではなく下2桁で扱っていたのか?
ここでデータの大きさをバイト単位からビット単位で考えてみましょう
昔は決まっていなかったそうですが、今は
1バイト=8ビットという決まりがあるのでそれに従って見ていきます
1ビットの表現範囲は2種類です
2ビットの表現範囲は4種類です
3ビットの表現範囲は8種類です
つまり表現範囲の計算式は「2のn乗」になりますね
日は1~31なので5ビットで表現できます
月は1~12なので4ビットで表現できます
さてここまで必要なビット数は9ビットです。つまり1バイト+1ビットです
ぴったり2バイトで扱おうとすると残り7ビットです
7ビットの表現限界は128種類です
4桁で扱うことは無理ですが下2桁で扱うには十分です
コンパイラによって変数の大きさが変わるので、定かではありませんが
ビット演算を駆使すれば
unsigned short型 変数1個で年月日を扱うことができますね
このようにプログラマ視点で見ると納得しますよね
コレ以外にも様々なプログラムが関係する問題が
過去にあったり未来に予測されていたりします
こういった事柄を調べてみて、考え方を広げれば
自分のプログラムで予測されるバグを発見できるかもしれませんね
ここまで読んでくれてありがとうざいます
参考になれば幸いです
お疲れ様でした
PR
COMMENT