我有一个没有符号的值,它需要将一个函数传递为一个有符号的值(它没有被函数所触及)。当它出来的时候我把它扔回未签名的地方。我知道,强制转换到签名的结果是在溢出时定义的实现,但我至少可以保证我返回时得到的值是相同的(比如函数指针)吗?
示例:
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;
}我确实有一个监护人,即有符号整数总是大于或等于无符号整数的字节数,所以不应该因为空间不足而丢失任何数据。
发布于 2016-12-09 10:32:38
不,你没有这样的保证: conv.integral
2如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2^n,其中n是用来表示无符号类型的位数)。注意:在两个补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。-end注记 3如果目标类型有符号,则如果可以在目标类型中表示,则该值不变;否则,该值为implementation-defined.。
发布于 2016-12-09 10:31:09
不,您不能,因为要签名的强制转换的结果是在溢出时定义的实现。
https://stackoverflow.com/questions/41058221
复制相似问题