簡體   English   中英

意外的數學分部輸出 - C ++

[英]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 -10unsigned int等效值。

發生這種情況是因為std::vectorsize()函數返回一個unsigned的size_t int (例如rating)除以size_tint被提升為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM