符号和无符号之间铸造
题
这是安全的:
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,而无需通过这种误导投去?
类型存在对通信也,不仅对编译过程的缘故。
分配,不能在一个符号的类型表示的数目是实现定义。然而,接下来的转换有一个标准的定义的行为。所以函数的结果是实现定义,如果是安全与否,是一个主观的问题。但跨平台的编译器或便携式事实并非如此。
不隶属于 StackOverflow