2017-10-31 7 views
0

以下のコードは、文字の平均値を取得しようとしています。これは、単一の文字のために働く は完全に.Butは、予想される結果は97と122(ASCII値)の間でなければなりません文字の平均値

Total is A 
65 
Total is A 
Total is â 
Total is ╞ 
name is -19 

文字

#include<iostream> 

template<typename T> 
decltype(auto) avgval(T const*beg, T const *end) 
{ 
    T total{}; 
    while (beg != end) 
    { 
     total += *beg; 
     std::cout << "Total is " << total << "\n"; 
     ++beg; 
    } 
    return total; 
} 

int main() 
{ 
    char name1[] = "A"; 
    int len = sizeof(name1) - 1; 
    std::cout << avgval(name1, name1 + len)/len << "\n"; 
    char name[] = "ABC"; 
    int length = sizeof(name) - 1; 
    std::cout << "name is " << avgval(name, name + length)/length << "\n"; 
    return 0; 
} 

出力のゴミ値を示し.However私はジャンク値が返さ見ます。すべての説明

答えて

3

変数totalは、このインスタンスではcharです。 charはご使用のプラットフォームで8ビットの符号が付けられており、その範囲は-128〜127です。

"ABC"のASCII合計は65 + 66 + 67 = 198です。範囲を超えています。

厳密に言えば、動作は未定義です。しかし、2の補数オーバーフローとみなすと、バイナリ表現は1100 0110となり、-58と解釈されます。 rounddown(-58/3) = -19