我有一个无符号值,需要将函数作为有符号值传递(函数不会触及它)。当它出现时,我把它转回到无符号。我知道转换的转换结果是溢出时定义的实现,但是我可以至少保证在转换它时会得到相同的值(比如函数指针)吗?
示例:
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;
}
我确实知道有符号整数总是大于或等于无符号整数(以字节为单位),因此不会因缺少空间而丢失数据。
答案 0 :(得分:6)
不,你没有这样的保证:[conv.integral]
2如果目标类型是无符号的,则结果值是与源一致的最小无符号整数 整数(模2 ^ n,其中n是用于表示无符号类型的位数)。 [注意:在两个 补码表示,这种转换是概念性的,并且位模式没有变化(如果有的话) 没有截断)。 - 后注]
3如果目标类型已签名,则该值如果可以在目标类型中表示,则不会更改; 否则,该值为实现定义。
答案 1 :(得分:0)
不,你不能,因为签名的强制转换的结果是在溢出时定义的实现。