オーバーフローを起こさずにint/Integer同士の積を求めたい場合、BigMulメソッドを用いることができます。 このメソッドは二つのint/Integerを引数にとり、それらの積をlong/Long型で返します。
Math.BigMulメソッドを使ってオーバーフローを起こさずに32ビット整数同士の積を求める
using System;
class Sample {
static void Main()
{
int a = int.MaxValue;
int b = 2;
Console.WriteLine("{0} * {1} = {2}", a, b, Math.BigMul(a, b));
// 同じ値の積を*演算子で求めるとオーバーフローとなる
Console.WriteLine("{0} * {1} = {2}", a, b, a * b);
}
}
オーバーフローのチェックを有効にしている場合
2147483647 * 2 = 4294967294 ハンドルされていない例外: System.OverflowException: 算術演算の結果オーバーフローが発生しました。 場所 Sample.Main()
オーバーフローのチェックを無効にしている場合
2147483647 * 2 = 4294967294 2147483647 * 2 = -2
オーバーフローのチェックの有効/無効の切り替えやその際の動作の違いなどについては整数型のオーバーフローとチェックを参照してください。