математика — неожиданный результат математического деления

У меня есть этот фрагмент кода тестирования (есть довольно много другого материала; однако, он чрезвычайно плотный и, вероятно, не имеет отношения к этому вопросу), который дает некоторые необъяснимые результаты. При компиляции этот блок:

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

2

Решение

Это происходит потому, что 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;
4

Другие решения

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;
9

(team1[m].rating - team2[n].rating) равно -20, Этот результат выражения повышается до unsigned int согласно правилам смешанных выражений и делится на team1.size(), уступая 2147483638 какой unsigned int эквивалент для signed int -10,

5
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector