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