[英]Unexpected Mathematical Division Output - 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>
(沒有反斜杠),'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;
(team1[m].rating - team2[n].rating)
等於-20
。 根據混合表達式的規則將此表達式結果提升為unsigned int
,並除以team1.size()
,得到2147483638
,它是signed int
-10
的unsigned int
等效值。
發生這種情況是因為std::vector
的size()
函數返回一個unsigned的size_t
。 將int
(例如rating)除以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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.