[C#] checked で算術オーバーフローをチェックして検出する方法

[C#] checked で算術オーバーフローをチェックして検出する方法

C# でオーバーフローを検出する

基本的に C# では、数値計算で算術オーバーフローが発生すると、格納先の型に収まらない上位ビットが破棄されてしまいます。この時、算術オーバーフローは例外とてキャッチできないので、これを検出することが難しくなります。

そこで checked コンテキストを設定することで、算術オーバーフローによって例外(System.OverflowException)を発生させることができます。

例えば、int型の引数2つを足した結果を返す関数があったとします。

static int Add(int x, int y)
{
    int result = x + y;
    return result;
}

この関数に引数を次のように渡すとオーバーフローが発生し、計算結果がおかしくなります。

static void Main(string[] args)
{
    var x = 2147483647; // int型最大値(=int.MaxValue)
    var y = 1;
    var result = Add(x, y);

    Console.WriteLine(result); // -2147483648
}

static int Add(int x, int y)
{
    int result = x + y; // ここでオーバーフロー
    return result;
}

checked ブロック、式を使って例外を発生させる

上記関数で、オーバーフロー時には例外を発生させるために、checked キーワードを使います。

ブロックで括って checked を指定します。

static int Add(int x, int y)
{
    // このブロック内でのオーバーフローで例外を発生させる
    checked
    {
        int result = x + y; // ここで例外発生
        return result;
    }
}

あるいは式として、checked を指定することもできます。

static int Add(int x, int y)
{
    int result = checked(x + y); // ここで例外発生
    return result;
}

checked キーワードを用いることで、オーバーフローを例外として検出することができるようになりました。

unchecked キーワード

unchecked キーワードをは、checked キーワードとは逆の働きをします。オーバーフローをチェックせず、あふれた桁を破棄するようになります。

なお、両方のキーワードを用いていない場合は、コンパイラオプションや環境設定のコンテキストが反映されるようです。デフォルトだと、unchecked になっているのではないでしょうか。

以上。

参考URL

C#カテゴリの最新記事