【せいすうおーばーふろー】

整数オーバーフロー とは?

最終更新:
💡 数値が整数型の器に収まらない、計算の落とし穴

整数の計算結果が表現できる範囲を超えてしまう現象。予期しない値になり、バグやセキュリティ脆弱性の原因となる。

📌 このページのポイント
整数型の「器」には、限界がある8ビット符号なし・折り返す方式の例255この型の上限0折り返した値+1Javaのintでも、通常の加算は折り返す2,147,483,647 + 1→ −2,147,483,648検出する演算や、範囲の確認を使う動作は言語・型・設定によって違う
上段は折り返す方式の例です。必ず折り返すとは限らず、検出してエラーにするなど、言語や設定で異なります。
ひよこ ひよこ
整数オーバーフローって何が起きるの?
ペンギン先生 ペンギン先生
固定幅の整数には表せる範囲があるんだ。範囲を超えたとき、走行距離計のように折り返す方式もあるけど、検出してエラーにする方式もあるよ。負の側の限界を超える場合も含むんだ。
ひよこ ひよこ
具体的にはどんな数で起きるの?
ペンギン先生 ペンギン先生
Javaのintは32ビットの符号付き整数で、最大値は2,147,483,647(約21億)。通常の加算で1を足すと、-2,147,483,648に折り返すよ。件数やサイズの計算などで、想定とは違う値を使ってしまう原因になるんだ。
ひよこ ひよこ
実際に問題になったことはあるのかな?
ペンギン先生 ペンギン先生
2038年問題があるよ。Unix時刻を符号付き32ビットの秒数で保持する仕組みでは、2038年に正の上限に達するんだ。すべてのUnixシステムが対象という意味ではなく、64ビットの時刻を扱う実装などへの対応が必要になるよ。
ひよこ ひよこ
どうやって防げばいいの?
ペンギン先生 ペンギン先生
入力の範囲を確認し、必要な大きさの型や検出付き演算を使うんだ。Rustでも通常の演算の検出はビルド設定に依存するから、言語名だけで安心はできないよ。checked_addなら加算が範囲を超えたことを戻り値で確認できるんだ。
もっと詳しく知りたい人へ

結果の変数だけ64ビットにすれば防げる?

計算そのものが狭い型で行われると、代入前にあふれることがあります。Javaではint同士の乗算はintで計算されます。必要なら演算前にlongへ広げ、広げた型の範囲にも収まるか確認します。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「整数オーバーフロー」って出てきたら「計算結果が、整数型で表せる範囲を超えること」と思えばだいたいOK!
📖 おまけ:英語の意味
「Integer Overflow」 = 整数のあふれ
💬 Overflow(あふれる)は容器から水があふれるイメージ。数値が器に収まらなくなるからこの名前だよ

参考資料

← 用語集にもどる