意外的数学分部输出 - C++

Mic*_*ang 2 c++ math types division

我有这段测试代码(有很多其他材料;但是,它非常密集,可能与这个问题无关),这已经产生了一些莫名其妙的输出.编译时,此块:

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;
Run Code Online (Sandbox Code Playgroud)

产生输出:

10 
30 
2 
2 
10 
2147483638
Run Code Online (Sandbox Code Playgroud)

'team1'和'team2'都是类型vector<player>(没有反斜杠),'player'结构如下所示:

struct player {
string name;
int rating;
player(string Name, int Rating) :
    name(Name), rating(Rating) {}
};
Run Code Online (Sandbox Code Playgroud)

Pau*_*l R 9

team1.size()并且team2.size()是unsigned(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;
Run Code Online (Sandbox Code Playgroud)


Som*_*ame 5

(team1[m].rating - team2[n].rating)等于-20.这个表达式结果被提升到unsigned int根据混合表达式的规则并除以team1.size(),得到的2147483638unsigned int等价的signed int -10.