64

Bjarne Stroustrup は The C++ Programming Language に次のように書いています。

符号なし整数型は、ストレージをビット配列として扱う用途に最適です。int の代わりに unsigned を使用して、正の整数を表すビットをもう 1 つ取得することは、ほとんど良い考えではありません。符号なしの変数を宣言することによって一部の値が正であることを保証しようとする試みは、通常、暗黙の変換規則によって無効になります。

size_tは、「正の整数を表すためにもう 1 ビット取得するため」に符号なしのようです。これは間違い (またはトレードオフ) でしたか? もしそうなら、自分のコードでの使用を最小限に抑える必要がありますか?

Scott Meyers による別の関連記事はこちらです。要約すると、彼は、値が常に正であるかどうかに関係なく、インターフェイスで unsigned を使用しないことを推奨しています。つまり、負の値が意味をなさない場合でも、必ずしも unsigned を使用する必要はありません。

4

4 に答える 4

66

size_t歴史的な理由から署名されていません。

「小規模」モデルの DOS プログラミングなど、16 ビット ポインタを使用するアーキテクチャでは、文字列を 32 KB に制限するのは現実的ではありません。

このため、C 標準では、(必要な範囲を介して)ptrdiff_t符号付きの対応するsize_tポインターと、ポインターの違いの結果の型が実質的に 17 ビットである必要があります。

これらの理由は、組み込みプログラミングの世界の一部にも当てはまります。

ただし、それらは最新の 32 ビットまたは 64 ビット プログラミングには適用されません。より重要な考慮事項は、C および C++ の不幸な暗黙の変換規則により、符号なしの型が数値に使用されるとバグ アトラクタになることです (およびしたがって、算術演算と大きさの比較)。20-20 後から考えると、例えばstring( "Hi" ).length() < -3が実質的に保証されている特定の変換規則を採用するという決定は、かなりばかげていて非現実的であったことがわかります。ただし、その決定は、現代のプログラミングでは、数値に符号なし型を採用することには重大な欠点があり、利点がないことを意味します –unsigned自己記述的な型名であることに気づき、typedef int MyType.

結論から言うと、それは間違いではありませんでした。これは、非常に合理的で実用的なプログラミング上の理由による決定でした。これは、Pascal のような境界チェック言語から C++ に期待値を移すこととは何の関係もありません (これは誤りですが、Pascal について聞いたことがない人もいますが、非常によくある誤りです)。

于 2012-04-16T04:00:20.463 に答える
25

size_t is unsigned because negative sizes make no sense.

(From the comments:)

It's not so much ensuring, as stating what is. When is the last time you saw a list of size -1? Follow that logic too far and you find that unsigned should not exist at all and bit operations shouldn't be permitted either. – geekosaur

More to the point: addresses, for reasons you should think about, are not signed. Sizes are generated by comparing addresses; treating an address as signed will do very much the wrong thing, and using a signed value for the result will lose data in a way that your reading of the Stroustrup quote evidently thinks is acceptable, but in fact is not. Perhaps you can explain what a negative address should do instead. – geekosaur

于 2012-04-16T02:32:01.350 に答える