【问题标题】:Cast unsigned to signed and back将未签名转换为已签名并返回
【发布时间】:2016-12-09 10:26:46
【问题描述】:

我有一个无符号值需要作为有符号值通过函数(函数没有触及它)。当它出来时,我把它扔回未签名的。我知道强制转换为已签名的结果是在溢出时定义的实现,但我至少可以保证当我将它强制转换回来时(如函数指针)最终得到相同的值吗?

例子:

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

我确实保证有符号整数总是大于或等于无符号整数(以字节为单位),因此不会因空间不足而丢失任何数据。

【问题讨论】:

    标签: c++ language-lawyer


    【解决方案1】:

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

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

    3 如果目标类型是有符号的,如果可以在目标类型中表示,则值不变; 否则,该值为实现定义

    【讨论】:

    • 或者 - 相反,是的,你确实有这个保证,只要你的价值不超过你要转换的范围。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 2011-10-27
      相关资源
      最近更新 更多