算術演算の計算結果が、メモリやレジスタといった格納先が表現できる限界を越えてしまうことです。
変数やレジスタなどの大きさは決まっているため、表現できる値の範囲にも限界があります。計算処理を行った結果、その値が表現できる範囲から外れてしまうことを指しています。
算術オーバーフローが発生した場合の動作は、プログラミング言語の仕様などによって異なります。ただ、算術オーバーフローが発生したのであれば、少なくとも正しい結果を得ることはできていません。それを無視して処理を続行させるケースもあり得ますが(収まりきらなかった上位桁を単に無視するだけで済ませるなど)、エラーや例外として扱うべき場合もあります。また、そもそも算術オーバーフローが起こらないように、格納先の大きさと実際に取りうる値の大きさに注意を払ったプログラムを書く必要があるかもしれません。
単に「オーバーフロー」と呼ぶことも多いですが、オーバーフローは様々な場面で使われている用語なので注意が必要です。
また、「オーバー」という言葉の響きや、アンダーフローという用語が存在することからか、上限値を超えることだけがオーバーフローであるかのように誤解されることがありますが、下限値を下回る場合もオーバーフローといいます(これをアンダーフローとは呼びません)。
C言語や C++ での算術オーバーフローは、符号付き整数型や浮動小数点型による計算の結果が、結果の型で表現できない場合に発生します。C言語では、符号付き整数型においては処理系定義の動作[1]、浮動小数点型において未定義の動作[2]、C++ ではいずれも未定義の動作とされています[3]。
符号無し整数型の値は必ず定義できることになっているため、符号無し整数型の演算ではオーバーフローは発生しません。簡単にいうと「計算結果の値
% (結果の型の最大値 + 1)」としたものが結果となります(%
は剰余)。[4][5]
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |