4 に答える
C++ は全範囲を必要とするため、符号なしの値を使用します。32 ビット システムでは、言語は 2 GB のベクターだけでなく、4 GB のベクターを使用できるようにする必要があります。(OS では 4 GB をすべて使用することはできないかもしれませんが、言語自体は邪魔になりたくないでしょう)
.NET では、符号なし整数は CLS に準拠していません。それらを (一部の .NET 言語で) 使用できますが、移植性と互換性が制限されます。したがって、基本クラス ライブラリでは、符号付き整数のみを使用します。
ただし、これらはどちらも特殊なケースです。ほとんどの場合、符号付きint
は十分な大きさです。したがって、両方が必要な範囲を提供する限り、両方を使用できます。
符号付き整数が持つ利点の 1 つは、アンダーフローの検出が容易になることです。配列の添字を計算していて、入力が間違っていたり、プログラムの論理エラーが原因で、最終的に index にアクセスしようとしたとします-1
。
符号付き整数を使用すると、簡単に検出できます。unsigned では、ラップアラウンドして になりUINT_MAX
ます。これにより、正の数を期待していたのに正の数が得られたため、エラーの検出がはるかに難しくなります。
本当に、それは依存します。C++ では範囲が必要なため unsigned を使用します。.NET は、署名されていない言語で動作する必要があるため、署名付きを使用します。
ほとんどの場合、どちらも機能し、場合によっては署名付きの方がコードでエラーをより確実に検出できる場合があります。
カウントとサイズに unsigned 型を使用するのは自然なことですが、それらが負でありながら意味のある場合を除きます。私の推測では、C++は兄の C と同じロジックに従っていると思いstrlen()
ます。size_t
malloc()
size_t
符号付き整数と符号なし整数を使用する C++ (および C) の問題は、2 種類を混合して使用する場合に、それらが互いにどのように変換されるかを知っておく必要があることです。プログラマーの無知と不注意によるこの問題を回避するために、すべての整数に signed int を使用することを推奨する人もいます。しかし、プログラマーは自分の商売道具 (プログラミング言語、コンパイラーなど) の使い方を知っていなければならないと思います。遅かれ早かれ、彼らは、自分が書いたものではなくても、他の誰かが持っているもので、改宗に苦しむでしょう. それは避けられません。
したがって、自分のツールを知り、自分の状況に適したものを選択してください。
ここにはいくつかの側面があります。
1) 最大値: 通常、符号付き数値の最大値は、対応する符号なし最大値の 1/2 です。たとえば C では、signed short の最大値は 32767 ですが、unsigned short の最大値は 65535 です (範囲の 1/2 は -ve 数値には必要ないため)。したがって、予想される長さまたはカウントが大きくなる場合は、符号なし表現の方が理にかなっています。
2) セキュリティ: ネットで整数オーバーフロー エラーを探すことができますが、次のようなコードを想像してください。
if (length <= 100)
{
// do something with file
}
...次に、「長さ」が符号付きの値である場合、「長さ」が -ve の数値であり (悪意、キャストなどによって)、コードが期待どおりに実行されないリスクがあります。これは、トランザクションごとにシーケンスがインクリメントされる以前のプロジェクトで見たことがありますが、使用した符号付き整数が最大符号付き整数値 (2147483647) に達すると、次のインクリメント後に突然 -ve になり、コードが処理できませんでした。それ。
基礎となる言語/API の考慮事項に関係なく、考慮すべき点がいくつかあります。
再利用可能なライブラリを設計していない場合(.NET用語で、たとえばVB.NETプロジェクトがC#クラスライブラリを使用する場合)、適切なものを選択します。もちろん、任意の種類のDLLを作成していて、ライブラリを別の言語のプロジェクトで使用できる可能性がある場合(ここでも、VB.NETが思い浮かびます)、非準拠の型(署名なし)に注意する必要があります。 )。