C の符号なし型には、主に 2 つの用途があります。
場合によっては、計算が型の範囲を超えたときに「ラップ」する値があると便利です。たとえば、多くの種類のハッシュまたはチェックサムを計算する場合、オーバーフローを防ぐためにオーバーサイズの変数や条件付きロジックを使用するよりも、オーバーフローを無視して一連の加算または乗算を単純に実行する方がはるかに便利です。
2 バイト変数が 32,767 ではなく 65,535 までの値を保持できると便利な場合があります。場合によっては、4 バイトの変数を 4,294,967,295 にすると便利ですが、それはあまり一般的ではありません。
C では、unsigned
変数に -1 を格納しようとすると、+1 に追加するとゼロになる値を格納する必要がありました (エラーやスコークを発生させることなく)。これは、最初の使用シナリオでは非常に役立ちました。2番目には望ましくありませんでしたが、Cには符号付き整数に対するオーバーフロートラップがまったくないため、(代数環ではなく)数値の計算が終了すると悪いことが起こるという原則の拡張と見なすことができます範囲。
C# は C とは異なり、数値オーバーフロー検出をサポートしているため、最初のスタイルの使用を許可しながら、2 番目のスタイルの使用に適用できます。残念ながら、変数、パラメーター、または値のタイプではなく、チェック済みまたは未チェックの数値コンテキストに基づいて決定が行われます。したがって、メソッドが型のパラメーターを受け入れ、コンテキストUInt32
内のコードunchecked
が -1 の値を渡そうとした場合、メソッドはそれを値 4,294,967,295 として認識します。「これは 0 から 4,294,967,295 の間の値である必要があります。checked /unchecked statusに関係なく、それ以外の場合は squawk と言うようにパラメーターをマークする方法はありません。したがってInt32
、上限 2,147,483,647の if をコードで受け入れる方が安全です。で十分かInt64
、そうでない場合。