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

时间:2016-12-09 10:26:47

标签: 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;
}

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

2 个答案:

答案 0 :(得分:6)

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

  

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

     

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

答案 1 :(得分:0)

不,你不能,因为签名的强制转换的结果是在溢出时定义的实现。