スポンサーリンク
※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~
オーバーフローとは
データ型で扱える数字の範囲を超えることをオーバーフローと言います。
例えば、byte型は0~255までの数字を扱います。
byte型で宣言した数字が、演算した結果255を超えてしまった場合は、「オーバーフロー」が発生していると言えます。
オーバーフローのことは、桁あふれと呼んだりします。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Checked02 { class Program { static void Main(string[] args) { Console.WriteLine("255+1の演算"); byte max = 255; Console.WriteLine("演算前の値:" + max); max += 1; Console.WriteLine("演算後の値:" + max); Console.WriteLine("0-1の演算"); byte min = 0; Console.WriteLine("演算前の値:" + min); min -= 1; Console.WriteLine("演算後の値:" + min); } } } |
実行結果
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行で済む場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Checked04 { class Program { static void Main(string[] args) { int max = int.MaxValue; max = checked(max + 1); } } } |
実行結果
ハンドルされていない例外: System.OverflowException: 算術演算の結果オーバーフローが発生しました。
以下の文は、int型の最大有効値を示します。
int.MaxValue
ソースコード(複数行の処理をチェックしたい場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Checked05 { class Program { static void Main(string[] args) { checked { int max = int.MaxValue; Console.WriteLine("int型の最大値は"+max); max += 1; Console.WriteLine("int型の最大値+1の値は" + max); } } } } |
実行結果
int型の最大値は2147483647
ハンドルされていない例外: System.OverflowException: 算術演算の結果オーバーフローが発生しました。
逆にオーバーフローを明示的にチェックしない場合は、uncheckedキーワードを使用します。checkedキーワードと使用する際の記述の仕方は同じです
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Unchecked01 { class Program { static void Main(string[] args) { unchecked { int max = int.MaxValue; Console.WriteLine("int型の最大値は" + max); max += 1; Console.WriteLine("int型の最大値+1の値は" + max); } } } } |
実行結果
int型の最大値は2147483647
int型の最大値+1の値は-2147483648
Visual Studioの設定で対応
オーバーフローが生じるソースコードをVisual Studioでコンパイルした場合、オーバーフローはチェックされません。
ただし、設定を変更すれば、ソースコード上でcheckedキーワードを使用せずとも、オーバーフローを検知できるようになります。
まず、「Properties」を開きます。
「ビルド」→「出力」で「詳細設定」をクリック。
「演算のオーバーフローおよびアンダーフローのチェック」の項目にチェックを入れてください。
※この設定で、この記事の一番最初のコードを実行した場合
~Webサイトを自分で作ってみませんか?~
Webサイトを運営するにはサーバーが必須です。
このサイトは、エックスサーバー のサーバーを使用しています。
エックスサーバーは無料で10日間お試しができます。