GCC 4.8.0编译32位.
我发现2和6的行为令人困惑:
int16_t s16 = 0;
double dbl = 0.0;
s16 = (int16_t)((double)32767.0); // 1: s16 = 32767
s16 = (int16_t)((double)32768.0); // 2: s16 = 32767
s16 = (int16_t)((double)-32768.0); // 3: s16 = -32768
s16 = (int16_t)((double)-32769.0); // 4: s16 = -32768
dbl = 32767.0;
s16 = (int16_t)dbl; // 5: s16 = 32767
dbl = 32768.0;
s16 = (int16_t)dbl; // 6: s16 = -32768
dbl = -32768.0;
s16 = (int16_t)dbl; // 7: s16 = -32768
dbl = -32769.0;
s16 = (int16_t)dbl; // 8: s16 = -32768我意识到它的实现是定义的,但是一致性还是不错的。有人能解释一下这是怎么回事吗?
发布于 2013-04-16 15:45:20
如前所述,“未定义”并不意味着“已定义的实现”。
如果您的值有超出限制的风险,则应在转换之前验证范围。或者您也可以使用一些库,例如,使用像itrunc(double)这样的boost数学函数,当超出范围时,您应该得到boost::math::rounding_error (不幸的是,我不知道您是否可以让它与您的int16_t一起工作)。
toolkit/utils/rounding/trunc.html
对于行为可能不同的原因:可能实现复制表示值的位,它意识到它超出了范围,并且它不关心保持为随机值的符号位。
https://stackoverflow.com/questions/16040184
复制相似问题