这安全吗:
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
取决于实现。
一旦你知道t1
,t2
§4.7/2 保证是uint16_t
2^16 到 的最低全等模数t1
。基本上,t1
mod 2^16。
我会说它是安全的,但为什么不使用 uint16_t 而不经历这种误导性的演员表呢?
类型的存在也是为了通信,不仅仅是为了编译过程。
分配一个不能用有符号类型表示的数字是实现定义的。然而,下一个转换具有标准定义的行为。所以函数的结果是实现定义的,如果安全与否,是一个主观问题。但它不能跨平台或编译器移植。