1

特定の長さを決定する引数を取る関数を作成するときは、常に を使用しますuint。値が負の数であることは意味がないためです。

しかし、.Net フレームワークでは反対のことが (非常に頻繁に) 見られます。例: http://msdn.microsoft.com/en-us/library/xsa4321w.aspx

String クラスの新しいインスタンスを、指定された回数繰り返される指定された Unicode 文字によって示される値に初期化します。

public String(
    char c,
    int count
)

また、` countが 0 未満のArgumentOutOfRangeException場合に an がスローされることも述べています。"

なぜcount議論をしませんuint!?

4

2 に答える 2

0

C の符号なし型には、主に 2 つの用途があります。

  1. 場合によっては、計算が型の範囲を超えたときに「ラップ」する値があると便利です。たとえば、多くの種類のハッシュまたはチェックサムを計算する場合、オーバーフローを防ぐためにオーバーサイズの変数や条件付きロジックを使用するよりも、オーバーフローを無視して一連の加算または乗算を単純に実行する方がはるかに便利です。

  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、そうでない場合。

于 2015-03-30T15:20:31.883 に答える