簡體   English   中英

無符號轉換為已簽名並返回

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM