无符号转换为已签名并返回

Ric*_*ter 6 c++ language-lawyer

我有一个无符号值,需要将函数作为有符号值传递(函数不会触及它).当它出现时我把它丢回原状.我知道转换为强制转换时执行定义的转换结果,但是我可以至少保证当我将其转换回来时(例如使用函数指针)我会得到相同的值吗?

例:

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;
}
Run Code Online (Sandbox Code Playgroud)

我确实保证有符号整数总是大于或等于无符号整数(以字节为单位),因此不会因缺少空间而丢失数据.

ale*_*in0 6

不,你没有这样的保证:[conv.integral]

2如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 ^ n,其中n是用于表示无符号类型的位数).[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断). - 尾注]

3如果目标类型已签名,则该值如果可以在目标类型中表示,则不会更改; 否则,该值是实现定义的.

  • 或者 - 相反,是的,你有这个保证,只要你的价值不超过你所投入的范围. (3认同)