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

时间:2016-05-26 01:57:32

标签: c++ casting standards unsigned-integer

如果我将无符号整数转换为有符号整数然后强制转换,我保证得到原始值吗?例如,根据C ++标准,此函数是否始终为任何平台上的任何true返回x

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 个答案:

答案 0 :(得分:6)

对于fg,答案是“不,这不保证”。

以下是标准所说的内容:

  

4.7积分转换

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

第2节讨论了函数gxunsigned的强制转换可能导致不使用二进制补码表示的系统上的表示更改,因此将数字转换回来可能会得到不同的值。

第3节讨论了函数f。当数字超出signed int的范围时,结果是实现定义的,因此不允许对将其转换回无符号的结果提出任何声明。