在C++

2017-04-11 90 views
3

無符號整數餘寫以下代碼:在C++

#include <iostream> 
using namespace std; 
int main() { 

    unsigned int i=1; 
    i=i-3; 
    cout<<i; 
    return 0; 
} 

輸出是垃圾值,這是可以理解的。
現在,我寫了下面的代碼:

#include <iostream> 
    using namespace std; 
    int main() { 

    unsigned int i=1; 
    i=i-3; 
    i=i+5; 
    cout<<i; 
    return 0; 
} 

現在輸出3.這裏發生了什麼?垃圾價值是如何被5添加的?

+12

它不是垃圾,值下溢到無符號整數最大值 - 2,然後你添加5到這個,所以它變得積極3 – EdChum

+1

查看:https://en.wikipedia.org/wiki/Two%27s_complement – Meccano

+0

無符號整數以明確定義的方式溢出(不像有符號整數)。相關問題:http://stackoverflow.com/questions/16056758/cc-unsigned-integer-overflow,http://stackoverflow.com/questions/9193880/overflowing-of- unsigned-int –

回答

6

考慮在最大可能值(UINT_MAX)接近於零的大鐘面上畫出的unsigned int的值。

從1中減去3會使你重新回到時鐘的3個位置(這會給你UINT_MAX - 1),並且將5加到你的前面5個位置。

實際效果是將2加1,但重要的是要知道,C++標準完全明確地定義了值。它是而不是垃圾,但與您平臺上的值UINT_MAX相關。

請注意,對於signed類型,此溢出的定義明確的性質並非如此。在C++中溢出signed類型的行爲是undefined

+0

我應該考慮0和INT_MAX 1? – metasj

+1

你的意思是UINT_MAX?如果是這樣,那麼考慮0和UINT_MAX之間的差值爲-1。然後你符合無符號算術。爲'unsigned'類型賦值'-1'被定義爲產生UINT_MAX。 – Bathsheba

+0

是的UINT_MAX。我提到1是0和UINT_MAX之間的絕對差值。現在很清楚。 – metasj