签名和未签名之间的转换

时间:2010-11-22 09:22:27

标签: c++ casting unsigned unsafe signed

这是安全的吗?

int main()
{
    boost::int16_t t1 = 50000; // overflow here.
    boost::uint16_t t2 = (boost::uint16_t)t1;
    std::cout << t1 << " "  << t2 <<  std::endl;
}

更具体一点:我将这些数据存储在一个表中,该表在其模式中使用了签名类型,是否可以安全存储,并以这种方式检索此数据?

谢谢!

3 个答案:

答案 0 :(得分:5)

不,我相信这是实施定义的。来自C ++草案标准,§4.7/ 3

  

如果目的地类型已签名,则   如果可以,则值不变   以目的地类型表示   (和位字宽度);否则,   价值是实施定义。

这适用于第一个声明。 int16_t已签名,但不能代表50000.因此t1的值取决于实施。

了解t1后,§4.7/ 2保证t2为最低uint16_t全等模数2 ^ 16到t1。基本上,t1 mod 2 ^ 16。

答案 1 :(得分:1)

我说这是安全的,但为什么不使用uint16_t而不经历这种误导性的演员?

也存在用于通信的类型,不仅仅是为了编译过程。

答案 2 :(得分:0)

分配一个无法在签名类型中表示的数字是实现定义的。然而,下一次转换具有标准定义的行为。因此,函数的结果是实现定义,如果安全与否,则是主观问题。但是跨平台或编译器可移植它不是。