整数型の場合、AbsメソッドでMinValueと同じ値の絶対値を求めようとするとオーバーフローとなるためOverflowExceptionがスローされる点に注意が必要です。 これは、例えばintの最小値(int.MinValue)である-2147483648
の絶対値+2147483648
は、intの最大値(int.MaxValue)である+2147483647
を超えていて、intの範囲内で表せないためです。
Math.Absメソッドで整数の最小値を指定すると例外OverflowExceptionをスローする
using System;
class Sample {
static void Main()
{
try {
Console.WriteLine(Math.Abs(int.MinValue)); // intの最小値
}
catch (OverflowException ex) {
Console.WriteLine(ex);
}
try {
Console.WriteLine(Math.Abs(long.MinValue)); // longの最小値
}
catch (OverflowException ex) {
Console.WriteLine(ex);
}
}
}
実行結果
System.OverflowException: 2 の補数の最小値を無効にすることはできません。 場所 System.Math.AbsHelper(Int32 value) 場所 Sample.Main() System.OverflowException: 2 の補数の最小値を無効にすることはできません。 場所 System.Math.AbsHelper(Int64 value) 場所 Sample.Main()
型と最小値・最大値については型の種類・サイズ・精度・値域 §.型のサイズ・精度と値域、オーバーフロー時の動作の変更については整数型のオーバーフローとチェックをご覧ください。