这是安全的吗?
int main()
{
boost::int16_t t1 = 50000; // overflow here.
boost::uint16_t t2 = (boost::uint16_t)t1;
std::cout << t1 << " " << t2 << std::endl;
}
更具体一点:我将这些数据存储在一个表中,该表在其模式中使用了签名类型,是否可以安全存储,并以这种方式检索此数据?
谢谢!
答案 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)
分配一个无法在签名类型中表示的数字是实现定义的。然而,下一次转换具有标准定义的行为。因此,函数的结果是实现定义,如果安全与否,则是主观问题。但是跨平台或编译器可移植它不是。