22

std::vector::size()size_typeは、符号なしで、通常は と同じ を返しますsize_t。たとえば、64 ビット プラットフォームでは 8 バイトです。

対照的に、 64 ビット プラットフォームでも通常 4 バイトQVector::size()の を返します。intこれは署名されているため、2^32 の途中までしか移動できません。

何故ですか?これは非常に非論理的であり、技術的にも制限されているように思われます。また、2^32 を超える数の要素が必要になる可能性はほとんどありませんが、signed int を使用すると、明確な正当な理由もなく、範囲が半分になります。おそらく、すべてのコンテナが意味のないサイズの型を返すようにすることを決定した人ではなく、iとして宣言するのが面倒な人々に対するコンパイラの警告を避けるために、より良い解決策でしょうか? その理由はおそらくそのばかげたことではないでしょうか?uintint

4

2 に答える 2

2

unsigned数値は2^n一部の値 mod ですn

符号付き数値は制限付き整数です。

「正の整数」の近似として符号なしの値を使用すると、符号なしの値が通常の整数とは異なる動作をするドメインの端に共通の値があるという問題が発生します。

利点は、符号なし近似がより高い正の整数に達し、アンダー/オーバーフローが明確に定義されていることです (Z のモデルとして見たときにランダムである場合)。

しかし、実際にptrdiff_tは、よりも優れているでしょうint

于 2014-10-28T22:57:58.610 に答える