C#の場合、以下のようにデフォルトでは整数型のオーバーフローチェックは行われません。
オーバーフローのチェック動作を変更するには、/checkedコンパイルオプションを指定するか、コード上でcheckedステートメントを使用します。 これはプリミティブ整数型にのみ有効なオプションです。
/checkedコンパイルオプション
整数型のオーバーフローをチェックするようにするには、コンパイル時に/checked+オプションを指定します。 チェックが有効な場合、オーバーフローが起こるとOverflowExceptionがスローされるようになります。
このオプションを指定しないか、/checked-
を指定するとデフォルトの動作となり、オーバーフローをチェックしないようになります。
プロジェクトファイルでこのオプションを設定する場合は、CheckForOverflowUnderflowプロパティで設定します。
checkedステートメント
/checked
オプションとは別に、コード上でcheckedステートメントもしくはuncheckedステートメントを使用することもできます。 checked
ステートメント内では、コンパイルオプション/checked+
・/checked-
の指定にかかわらず、オーバーフローのチェックを強制することができます。
逆にunchecked
ステートメント内ではオーバーフローのチェックを抑止できます。
演算子形式のchecked/unchecked
checked
/unchecked
は、次の例のように演算子の形式でも使用できます。
int同士の積をオーバーフローさせずに求めるにはMath.BigMulメソッドを使用することも出来ます。 詳しくは数学関数 §.積・商と剰余 (BigMul, DivRem)を参照してください。
非プリミティブ型とオーバーフローのチェック
同じ整数型でも、decimal
の演算ではchecked
/unchecked
の指定に関わらずオーバーフローのチェックが行われる点に注意してください。 これは、int
やlong
とは異なりdecimal
はプリミティブ型ではないことが理由です。
型の分類、プリミティブ型かどうかについては型の種類・サイズ・精度・値域 §.基本的なデータ型と対応する各言語の型を参照してください。
Visual Basicでのオーバーフローのチェック
VBではC#のchecked
/unchecked
ステートメントに相当するものは用意されておらず、オーバーフローのチェックをコード上・ブロックレベルで制御することができません。
ただ、コンパイルオプション/removeintchecksが用意されているので、オーバーフロー時の扱いを指定することはできます。 デフォルトでは/removeintchecks-
、つまりオーバーフローチェックの抑止がオフとなっていて、オーバーフローのチェックが行われます。 /removeintchecks+
を指定することでオーバーフローチェックの抑止がオンとなります。
プロジェクトファイルでこのオプションを設定する場合は、RemoveIntegerChecksプロパティで設定します。