У меня есть этот фрагмент кода тестирования (есть довольно много другого материала; однако, он чрезвычайно плотный и, вероятно, не имеет отношения к этому вопросу), который дает некоторые необъяснимые результаты. При компиляции этот блок:
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) {}
};
Это происходит потому, что size()
функция std::vector
возвращает 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;
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;
(team1[m].rating - team2[n].rating)
равно -20
, Этот результат выражения повышается до unsigned int
согласно правилам смешанных выражений и делится на team1.size()
, уступая 2147483638
какой unsigned int
эквивалент для signed int
-10
,