c# は規定では算術計算による overflow で例外を発生されません。
overflow とは、扱える範囲の数値を超える状態の事です。
例えば、c# の int 型が取りうる値の範囲は -2,147,483,648 ~ 2,147,483,647
です。
docs.microsoft.com docs.microsoft.com
int で扱える範囲を超した値を int 型の変数に代入すると、overflow が発生するというわけです。
overflow が発生すると計算結果が大幅に狂う事になります。以下のようなプログラムを書いてみます。
int a = Int32.MaxValue; int b = a + 10; Console.WriteLine(b); // -2147483639
表示される値は意図したものとは大きく異なっています。
overflow を起こされると困る場合には、何かしらの方法で検知する必要があります。c# では以下の方法があります。
- checked キーワードを使う
- コンパイル時に /checked+ オプションを付ける
checked { int a = Int32.MaxValue; int b = a + 10; Console.WriteLine(b); }
というような記述にすると、OverflowException
が発生します。
何で checked キーワードが気になったかというと Linq の Select の実装を眺めていると登場したからです。
内部では int 型変数の index をインクリメントしています。int のサイズを超えるような要素数だと OverflowException
が発生するようですね。