2017-09-10 7 views
1
string str = "abcdef"; 
cout << str.length() << endl; //6 
cout << str.length() - 7 << endl; //4294967295 

なぜstr.length() - 7が-1ではなく4294967295を返したのか分かりません。string :: lengthはfalseの値を返しますか?

これを説明するのを手伝ってもらえますか?

+1

[こちらを参照](https://ideone.com/Rrb8Rf)をご覧ください。答え**が** '-1'であることがわかります。違う形で-1(署名されているのではなく署名されていません)と見ています。 – PaulMcKenzie

+0

@PaulMcKenzie - 符号なしタイプの値は '-1'であることはできません。ただし、負の値が割り当てられている場合は、モジュロ演算を使用して値が変換されます。結果は、同じサイズの符号付き整数型変数と同じビット表現を持つことができます。 – Peter

答えて

6

str.length()の戻り型はsize_tある:

size_tの長()constはnoexcept。

このケースではunsigned intと考えることができます。

符号なし整数アンダーフローし、それが負の値になったとき、周りにラップし、あなたのシステムに4294967295

4294967295(2^32から1)を参照して、あなたを引き起こし、他の極端に行くのに対応します32ビットの符号なし型の最大値です。これは、32ビットの実装がかなり少ないことと一致しています。さらに、size_tでもかまいませんが、ではありません。は32ビットタイプである必要があります。

+1

値 '4294967295'は、32ビットの符号なし型の最大値に対応していることに注意してください。そして、 'size_t 'は32ビット型であってもよいが必須ではない。 – Peter

8

str.length()は、符号なしのsize_tを返します。この符号なしの結果がラップアラウンドし、そのため-1の代わりに4294967295が得られます。

+0

...符号なしの数値がラップするので...これはあなたが忘れた重要な部分です言及する。 – ifconfig

関連する問題