整数オーバーフロー

車のメーターがカンストしたあと、もう1km走ると突然ゼロに戻ってしまうような現象です。

定義 整数オーバーフロー(Integer Overflow)とは、コンピューターが数値を保存するためにあらかじめ決めておいたメモリの容量(器の限界)を超えたときに発生する計算エラーです。扱える限界を突破した瞬間、数値が異常なマイナス値やゼロに反転してしまいます。

車のメーターが「9999」から「0000」に戻る理由

走行距離を表示するアナログメーターをイメージしてみてください。4桁のメーターは、最大で「9999」までしか表示できません。

ここでさらに1km走っても、メーターは「10000」を表示できませんよね。5桁目を表示する物理的なスペースがないため、あふれた一番上の「1」は消え去り、結局「0000」に戻ってしまいます

コンピューターの内部でも、全く同じ原理が働いています。コンピューターは数値を保存する際、メモリのサイズをあらかじめ決めています。8個、32個、64個といった決まった数のビット(0と1を入れる部屋)を使うのです。その部屋を満杯にした状態から数値をもう1つ足すと、桁あふれが起きてコンピューターは一番上の桁を切り捨ててしまいます。

整数オーバーフロー原理の4桁計器図 最大値(4桁空間) 9 9 9 9 +1 1 溢れた1は消失! 0000リセット 0 0 0 0 4桁を超過し初期値へ循環

もう少し詳しく:なぜ突然マイナスの巨大な数になるのか?

単にゼロに戻るだけならまだしも、プログラミングの世界でより頻繁に発生し、かつ危険なのは、プラスの数値が突然巨大なマイナス値にひっくり返ってしまう現象です。

もう少し正確に言うと、コンピューターは正の数と負の数の両方を扱うために、一番左端の1ビットを「符号の判別用」として使っています。このビットが0ならプラス、1ならマイナスを意味します。

例えば、32ビットの整数型で表現できる最大の正の数は、約21億(2,147,483,647)です。ここに1を足すと、普通なら「21億1」になるところですが、ビット計算のルールによって先頭の符号ビットが0から1に切り替わってしまいます。その結果、コンピューターはこの値を約マイナス21億と誤認してしまうのです。ゲームでHPを上げすぎたら突然即死したり、銀行口座にお金を預けたら大借金を背負わされたりするようなバグは、まさにこれが原因で起こります。

整数オーバーフローによる符号反転図 符号ビット 0 1 1 ··· 1 +21億 +1 加算 1 0 0 ··· 0 -21億 1に反転! 急に負数に?!

現実世界を震撼させたオーバーフロー事件簿

この現象は、教科書の中だけの話ではありません。実際に数多くのサービスや現実世界を大混乱に陥れた歴史的事件がたくさんあります。

最も有名な例が、YouTubeの『江南スタイル』再生回数事件です。YouTubeは当初、再生回数の保存に32ビット整数(最大約21億)を使用していました。ところがPSY(サイ)の『江南スタイル』が世界的な大ヒットとなり21億回再生を突破したため、再生回数がマイナスに反転する危機に直面したのです。Googleのエンジニアたちは大急ぎで64ビット整数(上限は約900京)へとシステムを改修しました。

さらに悲劇的な事故も起きています。1996年、数百億円を投じて開発されたヨーロッパの宇宙ロケット「アリアン5」は、打ち上げからわずか37秒後に空中で爆発しました。ロケットの水平速度データを16ビットという小さな整数変数に無理やり代入したことでオーバーフローが発生し、姿勢制御システムが誤作動して軌道を外れてしまったことが原因でした。

🤔 よくある誤解

✕ 誤解

数値が器の限界を超えたら、コンピューターがすぐエラーを出して安全に停止するはずだ。

✓ 事実

C言語やC++をはじめとする多くのプログラミング言語では、エラーを出さずに静かにマイナスや異常な数値に書き換えて計算を続行してしまいます。そのため、バグに気づきにくく非常に危険です。

🧺 日常で出会う場面

1 YouTubeの再生回数が21億回を超えてマイナスになりかけたため、システムを改修したエピソード。
2 ゲームの所持金が上限を超えた瞬間、ゼロになったりマイナスの借金状態になったりするバグ。
3 宇宙ロケット「アリアン5」が飛行速度データを小さな変数に詰め込んでオーバーフローを起こし、爆発した事故。
💡 つまり ひとことで

コンピューターがあらかじめ決めた数値の上限を超えたとき、マイナスやゼロに数値がひっくり返ってしまう計算エラーのことです。