2017-02-13 73 views
2
int main() { 
    unsigned i = 5; 
    int j = -10; 
    double d = i + j; 
    long l = i + j; 
    int k = i + j; 
    std::cout << d << "\n";  //4.29497e+09 
    std::cout << l << "\n";  //4294967291 
    std::cout << k << "\n";  //-5 
    std::cout << i + j << "\n"; //4294967291 
} 

我相信signed int在做算術運算符之前被提升爲unsigned
雖然-10轉換爲無符號unsigned integer underflow是這個正確的術語??)將發生和添加後,它打印4294967291在C++中無符號整型促銷

爲什麼在int k打印-5的情況下不會發生這種情況?

回答

6

執行算術運算符的過程涉及轉換以使兩個值具有相同的類型。該過程的名稱是找到常見類型,對於intunsigned int的情況,轉換被稱爲usual arithmetic conversions。在這種情況下不使用術語promotion

i + j的情況下,int轉換爲unsigned int,加入UINT_MAX + 1到它。所以i + j的結果是UINT_MAX - 4,它在你的系統上是4294967291

然後,您將此值存儲在各種數據類型中;唯一需要進一步解釋的輸出是k。值UINT_MAX - 4不適合int。這稱爲超出範圍的分配並且結果值是實現定義的。在你的系統上,它明顯地分配了int值,它具有與unsigned int值相同的表示。

1

j轉換unsigned int此外面前,這種情況發生在你所有的i + j。快速實驗。

int k = i + j的情況下。正如您的實施和我的情況一樣,i + j產生:42949672914294967291大於std::numeric_limits<int>::max(),該行爲將被實現定義。爲什麼不嘗試將4294967291分配給int

#include <iostream> 

int main(){ 
    int k = 4294967291; 
    std::cout << k << std::endl; 
} 

產地:

-5 

如所見Here