ゲームのバグ

今もあるけど、昔は特に特定の数値を弄ることで発生するバグが多かった気がする(ドラクエのコイン関係とか)

これらがなんで発生するのかというと、一つにはデータの構造を知っていると分かる部分がある。オーバーフローとか。

・データ領域

ざっくり言うと、データを保存する部分は高層マンションのようになっていて、「1階の5号室」のようにデータが入ってる住所(アドレス)を指定して使用するようになっている。

ただ、この高層マンションは部屋間の壁が自由に出し入れ出来る形になっていて、一つの部屋(例えば8bitサイズ)だけで表現しきれない場合は二部屋四部屋割り当てて使うようになっている。

・二進数の話

もう一つ関係するのが0101とかで表される二進数の話。ただし今回は難しい話ではなく、十進数と同じく「繰り上がりが発生する」という事だけ覚えていて欲しい。

0101 + 1 = 0110 こんな感じ。一番下の桁に入り切らなくなったので、上に繰り上がった。

・そしてオーバーフローの話

オーバーフローは桁数をオーバーしてしまう事だけど、内部では何が発生するかというと、例えば8bit(二進数8桁)の最大値のデータに対して1を足すとする。

11111111 + 1 = 100000000

繰り上がりが発生して9桁になったから8bitには入り切らない。

オーバーフローを監視するタイプの環境もあるけど、そんなものがない場合はこの先頭の1がどこに行くかというと、部屋に入り切らないからお隣の住所に行ってしまう。つまり元の住所にある値がいきなり0になるだけでなく、隣にまで影響を与えてしまうのだ。

ちなみに先頭のbitが正負を表す場合もあり、この場合は急に数値が-になったりする。こわいね。

なお、この二進数の数値はON-OFFも表せる事からフラグ管理にも使われたりして、つまりオーバーフローでお隣のデータが書き換わったらそこはイベントフラグ管理用だったからイベントが勝手に発生したor発生しなくなったなんて事もあり得るのだった。