首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可能不一致的铸造行为

可能不一致的铸造行为
EN

Stack Overflow用户
提问于 2013-04-16 14:48:51
回答 1查看 158关注 0票数 5

GCC 4.8.0编译32位.

我发现26的行为令人困惑:

代码语言:javascript
复制
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

我意识到它的实现是定义的,但是一致性还是不错的。有人能解释一下这是怎么回事吗?

EN

回答 1

Stack Overflow用户

发布于 2013-04-16 15:45:20

如前所述,“未定义”并不意味着“已定义的实现”。

如果您的值有超出限制的风险,则应在转换之前验证范围。或者您也可以使用一些库,例如,使用像itrunc(double)这样的boost数学函数,当超出范围时,您应该得到boost::math::rounding_error (不幸的是,我不知道您是否可以让它与您的int16_t一起工作)。

toolkit/utils/rounding/trunc.html

对于行为可能不同的原因:可能实现复制表示值的位,它意识到它超出了范围,并且它不关心保持为随机值的符号位。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16040184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档