2014-03-25 40 views
0

我知道在C中,無符號到有符號整數的轉換是實現定義的,但它對於C++來說又是什麼?我想有人會問這已經,我搜查,但我找不到它。C++將無符號轉換爲帶符號整數的可移植性

我有一個函數,對無符號整數進行操作並返回一個相關的無符號整數。我通過轉換爲無符號類似於int num = -6; unsigned ret = func((unsigned)num); int ret_as_signed = (int)ret;的有符號整數傳遞該函數。在Visual Studio中工作正常,但我不知道它是多麼便攜。

是否有一種便攜的方式將無符號整數轉換爲帶符號整數?有可能只是將有符號整數轉換爲無符號整數?謝謝

+0

[可移植性如何將-1轉換爲無符號類型?](http://stackoverflow.com/questions/1667963/how-portable-is-casting-1-to-an- unsigned-type) – jterrace

+1

@jterrace不同意。這是signed到unsigned的轉換,我知道它是環繞的。我想知道的是無符號轉換爲signed。 – loop

+0

@test你不關心'-6'轉換爲'unsigned int'嗎? –

回答

1

將無符號整數轉換爲無符號值超出帶符號類型範圍的有符號整數是實現定義的。你不能指望能夠將一個負數整數無符號地返回到signed。 [1]

C++標準,[conv.integral],§ 4.7/3:

如果目標類型有符號,則該值是不變的,如果它可以在目標類型來表示(和位 - 字段寬度);否則,該值是實現定義的。

[1]它似乎有效,但沒有保證。

2

對於人簽署>無符號轉換的逆的便攜版,怎麼樣:

if (ret <= INT_MAX) 
    ret_as_signed = ret; 
else 
    ret_as_signed = -(int)(UINT_MAX - ret) - 1; 

你可以使用模板<limits>大概概括這一點。

+0

這也是一個很好的答案。我問了一個兩部分問題,rici回答了一部分,而你回答了另一部分問題。不幸的是,沒有辦法將兩者都標記爲正確。 – loop

相關問題