算術オーバーフロー
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/04/07 17:16 UTC 版)
プログラミング環境と算術オーバーフロー
プログラミング言語や実行環境の中には、算術オーバーフローを検出したときに例外をスローするなど、エラーハンドリングを容易にしてくれるものもある。
C#ではchecked
キーワード(checked
ステートメントやchecked
演算子)を使うことで、整数演算によってオーバーフローが発生したときSystem.OverflowException
がスローされるようになる[5]。ただし浮動小数点演算の場合はスローされない。他にも、整数型T
の引数を受け取るSystem.Math.Abs()
メソッドのオーバーロードは、T.MinValue
に対してSystem.OverflowException
をスローする[6]。
JavaはC#のchecked
に相当する機能を直接持たない。ただし、Java 8でMath
クラスに追加されたExact
系メソッドを使うと、オーバーフローが発生したときにArithmeticException
がスローされる。
ISO C/C++では、SIGFPE
のシグナルがサポートされている[7]。シグナルハンドラーを設定すると、POSIXではオーバーフロー発生時にFPE_INTOVF
またはFPE_FLTOVF
のエラーコードを伴うシグナルが発生する[8]。C++BuilderではFPE_INTOVFLOW
またはFPE_OVERFLOW
となる[9]。Microsoft Visual C++では整数オーバーフローによるシグナルは発生せず、浮動小数点数オーバーフロー発生時に_FPE_OVERFLOW
のエラーコードを伴うシグナルが発生する[10]。ただし、SIGFPE
のシグナルハンドラーからは復帰するべきではなく、そのまま終了するべきとされている[11]。
C99およびC++11では、直前の演算によって浮動小数点例外が発生したかどうかをチェックできるテスト関数fetestexcept()
を標準化している[12][13]。オーバーフローを検出するにはテストビットとしてFE_OVERFLOW
を使用する[14]。
Microsoft Visual C++のランタイムライブラリは、デフォルトではすべての浮動小数点例外をマスクしているが、_controlfp_s()
関数などを使ってオーバーフローの浮動小数点例外を有効化すると、Microsoft Windows固有のエラー処理機構である構造化例外[15]をスローするようになる[16]。なお、制御ワードの設定はスレッドごとに管理されているため、浮動小数点例外を有効化する場合はスレッドごとに設定が必要となる[17]。
DelphiやC++Builderでは、浮動小数点演算でオーバーフローが発生した場合、System.SysUtils.EOverflow
をスローする[18]。ただし、ARMアーキテクチャは浮動小数点例外をサポートしないため、すべての浮動小数点例外がマスクされている[19]。整数演算でオーバーフローが発生した場合、System.SysUtils.EIntOverflow
をスローするが、プロジェクトのオーバーフローチェックが有効になっている必要がある[20]。
- ^ 田辺皓正編著『マイクロコンピュータシリーズ15 8086マイクロコンピュータ』丸善株式会社、1983年4月30日、83頁。
- ^ MSC15-C. 未定義の動作に依存しない
- ^ Tell Programmers About Signed Integer Overflow Behavior
- ^ INT30-C. 符号無し整数の演算結果がラップアラウンドしないようにする
- ^ checked および unchecked ステートメント - オーバーフローチェック コンテキストを制御します - C# | Microsoft Learn
- ^ Math.Abs Method (System) | Microsoft Learn
- ^ SIGTERM, SIGSEGV, SIGINT, SIGILL, SIGABRT, SIGFPE - cppreference.com
- ^ <signal.h> - IEEE Std 1003.1-2017
- ^ signal(C RTL) - RAD Studio
- ^ _fpreset | Microsoft Learn
- ^ SIG35-C. シグナルハンドラ SIGSEGV、SIGILL、SIGFPE から復帰しない
- ^ FLP03-C. 浮動小数点エラーを検知して処理する
- ^ fetestexcept - cpprefjp C++日本語リファレンス
- ^ FE_OVERFLOW - cpprefjp C++日本語リファレンス
- ^ Structured Exception Handling - Win32 apps | Microsoft Learn
- ^ _controlfp_s | Microsoft Learn
- ^ Top Issues for Windows Titles - Win32 apps | Microsoft Learn
- ^ 浮動小数点例外 - RAD Studio
- ^ 浮動小数点演算について - RAD Studio
- ^ System.SysUtils.EIntOverflow - RAD Studio API Documentation
- ^ 失敗百選-アリアン5型ロケット爆発事故
- 1 算術オーバーフローとは
- 2 算術オーバーフローの概要
- 3 オーバーフローの処理方法
- 4 プログラミング環境と算術オーバーフロー
- 5 その他
- 算術オーバーフローのページへのリンク