2013-08-29 106 views
0

我想知道從較小的有符號整數到較大的無符號整數的類型轉換。看起來,編譯器首先將有符號整數轉換爲與目標相同大小的有符號整數,然後轉換爲無符號整數。C++有符號整數轉換爲無符號位數更多位

方面的以下C++代碼:

#include <assert.h> 
#include <iostream> 

typedef int sint; 
typedef unsigned __int64 luint; 

int main(int, char**) { 
    assert(sizeof(luint) > sizeof(sint)); 
    sint i = -10; 
    luint j = i; 
    std::cout << std::hex << j; 
} 

在Visual C++中,這得到:fffffffffffffff6

這就像我喜歡它。我能確定所有的編譯器都會這樣嗎?如果有符號整數先轉換爲無符號,然後轉換爲新的大小,那麼結果應該是fffffff6

回答

3

簽名爲無符號轉換使用模2 n算術運算。從C++ 11標準,部分4.7 積分轉化[conv.integral](§4.7/ 2):

如果目標類型是無符號,所得到的值是至少無符號整數全等到源 integer(modulo 2 n其中n是用於表示無符號類型的位數)。

j所以取值2 - 10,其爲0xfffffffffffffff6

+0

該標準的一部分需要重新閱讀,但現在對我來說是有意義的!謝謝。 – cxxl

+0

對不起,我可以補充說:「我能確定所有的編譯器都會這樣嗎?」是「是的,它由標準保證」=) –

相關問題