这是安全的:

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

要更加具体:我存储在其中在其模式中使用符号类型表这个数据,它是安全存储,并以这种方式获取该数据

谢谢!

有帮助吗?

解决方案

没有,我相信这是实现定义。从C ++标准草案,§4.7/ 3

  

如果目标类型是有符号的,所述   价值是不变的,如果它可以   在目标类型表示   (和比特音响场宽度);否则,   值是实现德音响奈德。

这适用于第一个语句。 int16_t签署,并且它不能代表50000所以t1的值取决于实现。

一旦知道t1t2由§4.7/ 2是最低uint16_t全等模2 ^ 16至t1保证。基本上,t1 MOD 2 ^ 16

其他提示

我会说这是安全的,但为什么不使用uint16_t,而无需通过这种误导投去?

类型存在对通信也,不仅对编译过程的缘故。

分配,不能在一个符号的类型表示的数目是实现定义。然而,接下来的转换有一个标准的定义的行为。所以函数的结果是实现定义,如果是安全与否,是一个主观的问题。但跨平台的编译器或便携式事实并非如此。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top