在C 11中是左移(<<)负整数未定义的行为吗?
在C 11中左移一个负的int未定义行为?
相关的标准段落是5.8:
令我困惑的部分是:
这应该被解释为意味着左移任何负数是UB吗?或者这只是意味着如果你的LS是负面的,结果不符合结果类型,那么它是UB? 此外,前面的条款说:
这使得显式地使用一个操作数的负数为UB.如果是UB对另一个操作数使用负数,我希望在这里也明确. 所以,底线是: -1 << 1 未定义行为? @Angew provided对标准版的一个psudocode解释,简洁地表达了一个可能的(可能)有效的解释.其他人质疑这个问题是否真的关于语言“行为是不确定”的适用性,而不是我们(StackOverflow)使用短语“未定义的行为”.这个编辑是为了进一步澄清我正在试图问的内容. @ Angew对Standardese的解释是: if (typeof(E1) == unsigned integral) value = E1 * 2^E2 % blah blah; else if (typeof(E1) == signed integral && E1 >= 0 && representable(E1 * 2^E2)) value = E1 * 2^E2; else value = undefined; 这个问题真的归结于这一点 – 实际上是正确的解释: value = E1 left-shift-by (E2) switch (typeof(E1)) { case unsigned integral : value = E1 * 2^E2 % blah blah; break; case signed integral : if (E1 >= 0) { if (representable(E1 * 2^E2)) { value = E1 * 2^E2; } else { value = undefined; } } break; } ? Sidenote在看着这个psudocode这一点使我很清楚,@ Agnew的解释是正确的. 解决方法
是的,我会说这是未定义的.如果我们将standardese翻译成伪代码:
if (typeof(E1) == unsigned integral) value = E1 * 2^E2 % blah blah; else if (typeof(E1) == signed integral && E1 >= 0 && representable(E1 * 2^E2)) value = E1 * 2^E2; else value = undefined; 我会说出他们对右手操纵的明确原因,而不是左手操纵的原因是你所引用的paragrpah(右手操纵的情况)适用于左转和右转. 对于左手操纵,裁决不一致.左移一个负数是未定义的,右移它是实现定义的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 给Postgresql已经存在的表中的列删除或者添加默认值
- ruby-on-rails – 从CakePHP切换到Ruby on Rails有多难?
- ruby-on-rails-3 – 如何在AWS Elastic Beanstalk应用程序上
- Flex/AS3/flash player支持屏蔽右键菜单,自定义菜单,并设置
- c# – 在展开/折叠时禁用TreeView节点上的回发
- Flex点击弹出菜单示例
- 【cocos2d-x 学习与应用总结】CCFileUtils的使用,iOS和and
- React Native开发环境配置-Android篇
- 神奇的拉普拉斯平滑(Laplacian Smoothing)及其在正则化上
- go依赖包管理工具对比