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

时间:2012-11-21 08:19:52

标签: 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;

产生输出:

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) {}
};

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:5)

(team1[m].rating - team2[n].rating)等于-20。此表达式结果将根据混合表达式的规则提升为unsigned int,并除以team1.size(),产生2147483638unsigned int等效于signed int {{ 1}}。

答案 2 :(得分:4)

这是因为size()的{​​{1}}函数返回std::vector,这是无符号的。将size_t(例如评分)除以int时,size_t会提升为int

将负数转换为无符号值将导致该值下溢,变得大于可由原始签名类型表示的最大正值。

为了防止这种情况,您需要明确说明在分割之前应将size()参数转换为unsigned int

int