C#では、代入の結果オーバーフローとなるような値を、メモリ上での表現を維持したまま代入したい場合はunchecked
を用います。
たとえば、値80000000(16) = 2147483648(10)はint
で扱える最大値を超えるため、これを単に代入しようとするとオーバーフローとなります。 一方、メモリ上での表現としての80000000(16)はint
として妥当な値です。 こういった場合は、unchecked
によってオーバーフローのチェックをせずに代入させることができます。
整数リテラルでのオーバーフローのチェックを抑止する
using System;
static class Sample {
static void Main()
{
// 16進表記での80000000(10進表記で2147483648)は、intで表現できる最大値(2147483647)を超える値であり、
// オーバーフローとなるため、そのままではコンパイルエラーになる
// メモリ上での表現はそのままでintにキャストさせたい場合は、uncheckedを用いる
// (この結果、メモリ上での表現で0x80000000、10進整数表現で'-2147483648'が代入される)
int hex1 = unchecked((int)0x80000000);
// 32ビットを超える表現となる値をint(32ビット整数型)に代入するような場合もオーバーフローとなる
// この場合、uncheckedを用いてキャストすると、下位32ビットのみが代入される
// (この結果、メモリ上での表現で0x00000000、10進整数表現で'0'が代入される)
int hex2 = unchecked((int)0x100000000);
Console.WriteLine(hex1);
Console.WriteLine(hex2);
}
}
実行結果
-2147483648 0
数値の型を明示するためにサフィックスを後置することもできます。 サフィックスを指定せず、var
による宣言を行う場合は、値の大きさに応じて型選択が行われます。