2016-05-18 46 views
0

我想將簽名的int32存儲爲一個未簽名的uint32,這樣我可以稍後從中提取int32。當它存儲像這樣的整數時,不會使用uint32本身的值,但不幸的是我不能在這種情況下使用聯合。我目前做的方式是通過簡單地將其轉換:有符號整數無符號和後面?

int32 signedVar = -500; 
uint32 unsignedVar = uint32(signedVar); 
func(int32(unsignedVar)); // should supply the function with -500 

這似乎工作,但恐怕它可能無法移植,而且有可能是不必要的轉換髮生在幕後爲我」希望是沒有任何操作的。

是-500還是其他任何負數保證能夠在轉換中倖存下來?如果沒有,是否存在「無痛」(沒有任何類型改變,只有轉換方法)替代方案?

編輯:我最關心的是確保在int32值在uint32因此它可以作爲以後的值相同的int32保存時,uint32版本從未使用過。 (編輯是因爲我要求我解釋這不是另一個問題的重複;它沒有說明轉換的結果應該是什麼樣的,或者它需要像這樣對稱,使它過於籠統這裏應用)

+1

爲什麼你需要去那裏又回來? – NathanOliver

+2

使用reinterpret_cast? –

+0

@NathanOliver - tbh,懶惰。有一種邊緣情況,可能會在數組中存在負索引,並且我不希望將該機器寫入管道以處理它。 –

回答

1

如果您的機器使用1s補碼或符號大小算術(至少C標準允許;不確定C++),那麼這個雙重轉換將把值-0轉換爲0。你的機器使用二進制補碼,那麼這將很好。這就是說,我不知道在過去的30年裏,任何計算機都使用了除2s補碼以外的任何其他算法。