[英]Cast unsigned to signed and back
我有一個無符號值,需要將函數作為有符號值傳遞(函數不會觸及它)。 當它出現時,我把它轉回到無符號。 我知道轉換為強制轉換時執行定義的轉換結果,但是我可以至少保證當我將其轉換回來時(例如使用函數指針)我會得到相同的值嗎?
例:
int32_t function_with_default(int32_t a_Default)
{
// Try some stuff
// ...
// Fall back to default
return a_Default;
}
void main()
{
uint32_t input = UINT32_MAX;
uint32_t output = static_cast<uint32_t>(function_with_default(static_cast<int32_t>(input));
// Is is guarenteed to be true?
input == output;
}
我確實保證有符號整數總是大於或等於無符號整數(以字節為單位),因此不會因缺少空間而丟失數據。
不,你沒有這樣的保證:[conv.integral]
2如果目標類型是無符號的,則結果值是與源整數一致的最小無符號整數(模2 ^ n,其中n是用於表示無符號類型的位數)。 [注意:在二進制補碼表示中,此轉換是概念性的,並且位模式沒有變化(如果沒有截斷)。 - 尾注]
3如果目標類型已簽名,則該值如果可以在目標類型中表示,則不會更改; 否則,該值是實現定義的 。
不,你不能,因為簽名的轉換結果是溢出時定義的實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.