2017-03-20 19 views
3

私は2つの引数を持つ関数、要素がテストされているベクトル、真または偽として入力するブール変数を持っています。真であれば、桁数の和が偶数であるすべての要素を分離して新しいベクトルに(同じ順序で)置き、そのベクトルを返すことになっています。 falseの場合、それは反対の奇数です。そして、私はここですでに使っているものだけを使うことができます。なぜ正しく動作しないのですかNumeric_limits

これは見た目です。

std::vector<int> IzdvojiElemente(std::vector<int> v, bool flag){ 
    std::vector<int> n; 
    for(int i(0); i<v.size();i++){ 
    int suma(0); 
    int temp(v[i]); 
    if(temp<0) temp*=-1; 
    while(temp>0){ 
     suma+=temp%10; 
     temp/=10; 
    } 

    if(flag && suma%2==0) n.push_back(v[i]); 
    if(!flag && suma%2!=0) n.push_back(v[i]); 

    } 
    return n; 
} 

そして、これはそれが動作しないために主要機能の一つである:

std::vector<int> v1 {1,std::numeric_limits<int>::min(),2, std::numeric_limits<int>::max(),5}; 
std::vector<int> v2; 

v2 = IzdvojiElemente(v1, false); 

for(int i=0; i < v2.size(); i++) 
    std::cout << v2[i] << " "; 

これは、私は(出力として)を取得することになったものです。

1 -2147483648 5 

これは私が得たものです:

1 5 

som数値制限を無視するか、間違ったベクトルでそれらをソートしません。そして私は理由を知らない。それ以外の場合は、必要に応じて動作します。そして多分それはオーバーフローですが、私はどこを見ることができません。

答えて

4

はい、これはオーバーフローです。符号付き整数の2の補数表現(主流プラットフォームでの共通表現)では、表現可能な範囲は対称ではないことに注意してください。最も低い表現可能な数値が-2147483648である場合、最も高い表現可能な数値は2147483647です。

-2147483648 * -1は、符号付き整数オーバーフローおよび未定義ビヘイビアです。プログラムが間違っていて何かが起こる可能性があります。

あなたが正しくかかわらず、内部表現のstd::numeric_limits<int>::min()を扱うことになっている場合、あなたは違った負の数に対処する必要があります(たとえば、負の数字の和を計算するなどして、ちょうど計算された合計値を符号逆)。

+0

「表現可能」という単語(lではなくk)で間違いを犯しました。 –

関連する問題