checkedでオーバーフローをチェック(C#)

  • このエントリーをはてなブックマークに追加

スポンサーリンク

※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~

オーバーフローとは

データ型で扱える数字の範囲を超えることをオーバーフローと言います。

例えば、byte型は0~255までの数字を扱います。

byte型で宣言した数字が、演算した結果255を超えてしまった場合は、「オーバーフロー」が発生していると言えます。

オーバーフローのことは、桁あふれと呼んだりします。

ソースコード

実行結果

255+1の演算
演算前の値:255
演算後の値:0
0-1の演算
演算前の値:0
演算後の値:255

byte型は8ビットで数字を表現します。つまり2の8乗の256通り。

ここで、2進法で255を表現すると「11111111」となります。これに1を足すと以下のようになります

    11111111
  +00000001
=100000000

byte型だと9桁の数字を扱えないので、255に1を足すと0になるというおかしな結果になります。

checked

オーバーフローを明示的にチェックしたい場合は、checkedを使用します。

checkedキーワードは以下のように記述します。

※1行で済む場合

checked(数値)

※複数行の処理をチェックしたい場合

checked
  {
    オーバーフローが発生しそうな処理文;
  }

ソースコード(1行で済む場合)

実行結果

ハンドルされていない例外: System.OverflowException: 算術演算の結果オーバーフローが発生しました。

以下の文は、int型の最大有効値を示します。

int.MaxValue

 

ソースコード(複数行の処理をチェックしたい場合)

実行結果

int型の最大値は2147483647
ハンドルされていない例外: System.OverflowException: 算術演算の結果オーバーフローが発生しました。

 

逆にオーバーフローを明示的にチェックしない場合は、uncheckedキーワードを使用します。checkedキーワードと使用する際の記述の仕方は同じです

ソースコード

実行結果

int型の最大値は2147483647
int型の最大値+1の値は-2147483648

Visual Studioの設定で対応

オーバーフローが生じるソースコードをVisual Studioでコンパイルした場合、オーバーフローはチェックされません。

ただし、設定を変更すれば、ソースコード上でcheckedキーワードを使用せずとも、オーバーフローを検知できるようになります。

まず、「Properties」を開きます。

 

「ビルド」→「出力」で「詳細設定」をクリック。

「演算のオーバーフローおよびアンダーフローのチェック」の項目にチェックを入れてください。

※この設定で、この記事の一番最初のコードを実行した場合

~プログラミングを勉強してみませんか?~

TechAcademy [テックアカデミー] 無料の体験講座が用意されているので、気軽に体験できます。

※私(サイト主)も無料体験講座を実際に受けてみました(→感想)

     

コメントを残す

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)