2017-03-08 159 views
0

代碼:C++算術類型轉換與無符號&符號整數

#include<iostream> 
using std::cout; using std::endl; 

int main() 
{ 
    unsigned int i = 5; 
    int x = -3; 

    cout << "(i + x) = " << (i + x) << endl; 

    cout << "Set x to -6" << endl; 
    x = -6; 

    cout << "(i + x) = " << (i + x) << endl; 
} 

輸出:

(i + x) = 2 
Set x to -6 
(i + x) = 4294967295 

在該示例中,結果的類型由返回第(i + x)的是一個無符號整數,但是,我認爲在算術類型轉換時,在操作發生之前,有符號整數(在這種情況下是變量「x」)應該被「提升」爲無符號整數。由於(i + x)的第一個結果是(5 +(2^31 - 1 - 3))= 4294967297而不是2,所以一定不是這種情況。有沒有我在這裏失蹤的東西?在我看來,只有最終結果被轉換爲無符號整數,而不是最初的操作數。

+0

無符號數字[wrap modulo](http://stackoverflow.com/a/22801135/1708801) –

回答

4

你的錯誤是假設計算是(5 + (2^31 - 1 - 3))-3unsigned解釋基於最大值2^32 - 1UINT_MAX),而不是2^31 - 1INT_MAX)。所以你採取的是2^32 - 1 - 3UINT_MAX - 3),加5,並且因爲超過了UINT_MAX,它至少在你的二進制補碼系統上用32位ints繞回2

相關問題