2

私はテスト コードのこの部分を持っています (他にもかなり多くの資料がありますが、非常に密度が高く、この質問とは無関係である可能性があります)。説明のつかない出力が生成されています。コンパイルすると、このブロック:

cout << team1[m].rating << endl;
cout << team2[n].rating << endl;
cout << team1.size() << endl;
cout << team2.size() << endl;
cout << (team2[n].rating - team1[m].rating) / team2.size() << endl;
cout << (team1[m].rating - team2[n].rating) / team1.size() << endl;

出力を生成します:

10 
30 
2 
2 
10 
2147483638

'team1' と 'team2' はどちらもタイプvector<player>(バックスラッシュなし) であり、'player' 構造体は次のように表示されます。

struct player {
string name;
int rating;
player(string Name, int Rating) :
    name(Name), rating(Rating) {}
};
4

3 に答える 3

9

team1.size()team2.size()署名されていない ( ) size_t- コードを次のように変更します。

cout << (team2[n].rating - team1[m].rating) / static_cast<int>(team2.size()) << endl;
cout << (team1[m].rating - team2[n].rating) / static_cast<int>(team1.size()) << endl;
于 2012-11-21T08:21:54.553 に答える
5

(team1[m].rating - team2[n].rating)に等しい-20です。unsigned intこの式の結果は、混合式の規則に従って に昇格され、 で除算され、に相当する結果がteam1.size()得られます。2147483638unsigned intsigned int -10

于 2012-11-21T08:26:28.407 に答える
4

これは、 のsize()関数が符号なしの をstd::vector返すために発生します。(格付けなど) を でsize_t割ると、は に昇格します。intsize_tintunsigned int

負の数を符号なしの値に変換すると、その値がアンダーフローし、元の符号付きの型で表現できる最大の正の値よりも大きくなります。

これを防ぐintには、除算の前に size() 引数を変換する必要があることを明示的に述べる必要があります。

cout << (team2[n].rating - team1[m].rating) / static_cast<int>(team2.size()) << endl;
cout << (team1[m].rating - team2[n].rating) / static_cast<int>(team1.size()) << endl;
于 2012-11-21T08:32:43.707 に答える