2016-06-14 4 views
0

このループが "INFINITE"を印刷する理由を理解できません。文字列の長さが1の場合、length()-2はどのように大きな整数になりますか?std :: string length()関数はどのように機能しますか?

size_tを返し std::string.length()
for(int i=0;i<s.length()-2;i++) 
{ 
    cout<<"INFINITE"<<endl; 
} 
+5

ヒント:長さが負にすることはできません。したがって、署名する必要はありません。 'size_t'のタイプを調べてください – enhzflep

+0

[MCVE] –

+0

を投稿してください。恐らく警告メッセージが表示されますが、無視してください。 – i486

答えて

5

。これは符号なし整数型です。整数のオーバーフローが発生しています。擬似コードでは:お使いの場合には

0 - 1 = int.maxvalue 

は、具体的には、次のとおりです。SIZE_MAXは通常2^32等しい

(size_t)1 - 2 = SIZE_MAX 

から1

1

std::string::length()std::string::size_typeを返します。

std::string::size_typeは、(文字列のアロケータの)allocator_traits<>::size_typeと同じ型に指定されています。

これは、符号なしタイプであると指定されています。

したがって、数値はラップ(定義された動作)し、巨大になります。正確にどのくらいの巨大さは、アーキテクチャに依存します。

あなたはこの小さなプログラムで、あなたのアーキテクチャ上でそれをテストすることができます。

#include <limits> 
#include <iostream> 
#include <string> 
#include <utility> 
#include <iomanip> 

int main() { 

    using size_type = std::string::size_type; 

    std::cout << "unsigned : " << std::boolalpha << std::is_unsigned<size_type>::value << std::endl; 
    std::cout << "size  : " << std::numeric_limits<size_type>::digits << " bits" << std::endl; 
    std::cout << "npos  : " << std::hex << std::string::npos << std::endl; 
} 

リンゴのx64の場合:

unsigned : true 
size  : 64 bits 
npos  : ffffffffffffffff 
+2

符号付き整数が許される 'size_t' beeingのソースはありますか? – MFH

+0

@MFH私の悪い。 18.2は、それが署名されないことを要求する。 –

関連する問題