オーバーフローのチェック

オーバーフローのチェック - C# によるプログラミング入門 | ++C++; // 未確認飛行 C


checkedキーワードを使えばオーバーフローが発生した場合に例外を投げることができます。

using System;

class Program {
    static void Main() {
        byte b = 255;
        
        // バイトは0〜255までしか扱えないのでオーバーフローする
        b = b + 1;
        
        Console.WriteLine( b );
    }
}
$ main
0

上記のように通常このような場合、オーバーフローさせてもエラーにならず0と表示されます。

次はcheckedキーワードを使った例です。

using System;

class Program {
    static void Main() {
        byte b = 255;
        
        // checkedで囲む
        checked {
            b = (byte)(b + 1);
        }
        
        Console.WriteLine( b );
    }
}
$ main
ハンドルされていない例外: System.OverflowException: 算術演算の結果オーバーフローが発生しました。
   場所 Program.Main()

見事例外が発生しましたね。ちなみにcheckedキーワードは式に対しても使えます。

using System;
class Program {
    static void Main() {
        byte b = 255;
        
        // 式にも使える
        b = checked( (byte)(b + 1) );
        
        Console.WriteLine( b );
    }
}
$ main
ハンドルされていない例外: System.OverflowException: 算術演算の結果オーバーフローが発生しました。
   場所 Program.Main()

うまくいってますね。

またcheckedとは逆に例外を明示的に発生させないuncheckedというものあります。

ですが元々例外は発生しないのがデフォルト仕様なので使い道としては、例えばcheckedブロック内で、明示的にこの部分ではオーバーフローしても良いときに使う感じでしょうか。

記述方法はcheckedと一緒なので割愛。