2012-11-21 36 views
2

我有这段测试代码(有相当多的其他材料;但是,它非常密集,可能与这个问题无关),它产生了一些莫名其妙的输出。在编译时,该块:意外的数学分区输出 - C++

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>型(无反斜杠)的,并显示 '播放器' 结构,如下所示:

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

回答

4

这是因为std::vectorsize()函数返回一个size_t,它是无符号的。当将int(例如评分)除以size_t时,int被提升为unsigned int

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

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

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; 
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; 
+0

为什么你认为所需的结果是签名?计算中需要一个绝对值很有可能 – SomeWittyUsername

+0

@icepack:在OP没有任何信息的情况下,相对于预期的结果,我只能使用提供的信息工作 - 似乎是从无符号模数回绕在这种情况下,促销就是“意外”。如果需要其他一些行为,我相信OP会进一步澄清。 –

5

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