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)
我确实保证有符号整数总是大于或等于无符号整数(以字节为单位),因此不会因缺少空间而丢失数据.
不,你没有这样的保证:[conv.integral]
2如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 ^ n,其中n是用于表示无符号类型的位数).[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断). - 尾注]
3如果目标类型已签名,则该值如果可以在目标类型中表示,则不会更改; 否则,该值是实现定义的.