代码之家  ›  专栏  ›  技术社区  ›  EFanZh

有符号整数和无符号整数之间的转换

  •  2
  • EFanZh  · 技术社区  · 8 年前

    如果我将一个无符号整数转换为一个有符号整数,然后再转换回来,我能保证得到原始值吗?例如,此函数是否总是返回 true 对于任何 x 根据C++标准,在任何平台上?

    bool f(unsigned int x)
    {
        return x == static_cast<unsigned int>(static_cast<int>(x));
    }
    

    这个怎么样?

    bool g(int x)
    {
        return x == static_cast<int>(static_cast<unsigned int>(x));
    }
    
    1 回复  |  直到 8 年前
        1
  •  7
  •   Sergey Kalinichenko    8 年前

    答案是“不,这不保证” f g .

    以下是标准对此的说明:

    4.7积分转换

    1. 如果目标类型是无符号的,则结果值是与源类型一致的最小无符号整数 整数(模2 n 其中n是用于表示无符号类型的位数)。[注:两秒钟内 补码表示,这种转换是概念性的,位模式没有变化(如果没有截断)。尾注]
    2. 如果目标类型是有符号的,如果可以在目标类型中表示,则该值不变;否则,该值是实现定义的。

    第2节讨论功能 .演员阵容 x unsigned 在不使用二的补码表示法的系统上,可能会导致表示法的改变,因此将数字转换回可能会得到不同的值。

    第3节讨论功能 f .当号码在外时 signed int 的范围,则结果是实现定义的,因此不允许对将其转换回无符号的结果进行任何声明。