1

这安全吗:

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

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

谢谢!

4

3 回答 3

5

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

如果目标类型是有符号的,则如果它可以在目标类型(和位域宽度)中表示,则值不变;否则,该值是实现定义的。

这适用于第一个语句。 int16_t有符号,它不能代表50000。所以值t1取决于实现。

一旦你知道t1t2§4.7/2 保证是uint16_t2^16 到 的最低全等模数t1。基本上,t1mod 2^16。

于 2010-11-22T09:27:20.637 回答
1

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

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

于 2010-11-22T09:27:40.263 回答
0

分配一个不能用有符号类型表示的数字是实现定义的。然而,下一个转换具有标准定义的行为。所以函数的结果是实现定义的,如果安全与否,是一个主观问题。但它不能跨平台或编译器移植。

于 2010-11-22T09:37:20.993 回答