C#では、組み込みの整数は、事前定義された長さのビット値のシーケンスで表されます。基本int
データ型の場合、その長さは32ビットです。32ビットは4,294,967,296の異なる可能な値しか表すことができないため(2 ^ 32であるため)、コードが継続的に増加する値で永久ループすることはありません。
int
正の数と負の数の両方を保持できるため、数の符号を何らかの方法でエンコードする必要があります。これは最初のビットで行われます。最初のビットが1の場合、数値は負です。
16進数と10進数の数直線上に配置されたint値は次のとおりです。
Hexadecimal Decimal
----------- -----------
0x80000000 -2147483648
0x80000001 -2147483647
0x80000002 -2147483646
... ...
0xFFFFFFFE -2
0xFFFFFFFF -1
0x00000000 0
0x00000001 1
0x00000002 2
... ...
0x7FFFFFFE 2147483646
0x7FFFFFFF 2147483647
このグラフからわかるように、可能な最小値を表すビットは、符号ビットの解釈を無視して、可能な最大値に1を加算することによって得られるものです。このように符号付き数値を加算すると、「整数の桁あふれ」と呼ばれます。整数のオーバーフローが許可されるか、エラーとして扱われるかどうかは、C#のchecked
andステートメントで構成できます。unchecked
デフォルトはチェックされていないので、エラーは発生しませんでしたが、プログラムにそのクレイジーな少数が含まれています。
この表現は2の補数と呼ばれます。