C++ 意外的数学除法输出-C++;

C++ 意外的数学除法输出-C++;,c++,math,types,division,C++,Math,Types,Division,我有这段测试代码(有相当多的其他材料;但是,它非常密集,可能与这个问题无关),它产生了一些令人费解的输出。编译时,此块: cout << team1[m].rating << endl; cout << team2[n].rating << endl; cout << team1.size() << endl; cout << team2.size() << endl; cout << (

我有这段测试代码(有相当多的其他材料;但是,它非常密集,可能与这个问题无关),它产生了一些令人费解的输出。编译时,此块:

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;
“team1”和“team2”都是
vector
(不带反斜杠)类型,“player”结构如下所示:

struct player {
string name;
int rating;
player(string Name, int Rating) :
    name(Name), rating(Rating) {}
};
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;

cout
(team1[m].评级-team2[n].评级)
等于
-20
。根据混合表达式的规则,此表达式结果被提升为
无符号int
,并除以
team1.size()
,得到
2147483638
,这是
有符号int
-10
无符号int
等价物,因为
大小()
std::vector
函数返回一个无符号的
size\u t
。当将
int
(如评级)除以
size\u t
时,
int
将提升为
无符号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;

cout为什么假设所需结果已签名?这很可能是一个绝对值是必要的,在这个过程中calculation@icepack:在OP中没有任何与预期结果相反的信息的情况下,我只能使用提供的信息-在这种情况下,未签名提升的模环绕似乎是“意外的”。我相信OP会进一步澄清是否需要其他行为。
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;