将无符号转换为有符号并相应地进行反向转换

7

我有一个无符号值需要作为有符号值通过函数传递(函数不会对其进行更改)。当它出来时,我将其强制转换回无符号值。我知道在溢出时,将其强制转换为有符号值的结果是实现定义的,但我能否保证在将其强制转换回去时得到相同的值(就像函数指针一样)?

示例:

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;
}

我有保证,有符号整数的字节数始终大于或等于无符号整数,因此不会因为空间不足而丢失数据。

2个回答

6
不,您没有这样的保证:[conv.integral]
2 如果目标类型是无符号的,则结果值是源整数对2 ^ n取模后最小的无符号整数(其中n是用于表示无符号类型的位数)。[注意:在二进制补码表示中,此转换是概念性的,如果没有截断,则位模式不会改变。——注释结束]
3 如果目标类型是有符号的,并且它可以用目标类型表示,则该值不变;否则,该值为实现定义。

3
相反,如果您所转换的值不超出目标范围,那么您确实可以得到这个保证。 - UKMonkey

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接