スポンサーリンク
※サイト運営にサーバーは必須です※
~ ロリポップ! はコスパのよい初心者向けサーバーです~
オーバーフローとは
データ型で扱える数字の範囲を超えることをオーバーフローと言います。
例えば、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」を開きます。
「ビルド」→「出力」で「詳細設定」をクリック。
「演算のオーバーフローおよびアンダーフローのチェック」の項目にチェックを入れてください。
※この設定で、この記事の一番最初のコードを実行した場合
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。