首页 > 后端开发 > C++ > 为什么左移负数在 C 中是未定义的行为,但在 C 中是定义的?

为什么左移负数在 C 中是未定义的行为,但在 C 中是定义的?

Mary-Kate Olsen
发布: 2024-12-11 10:14:11
原创
479 人浏览过

Why is Left Shifting a Negative Number Undefined Behavior in C but Defined in C  ?

负操作数上下文中的左移操作和未定义行为

在 C 中,当左侧操作数为负数时,左移操作会调用未定义的行为。根据 ISO C99,仅针对非负符号操作数明确定义了行为。这是由于表示空出的位时可能存在歧义。

C 差异

与 C 不同,C 定义了带有负操作数的左移运算的行为。 C -03 指定结果是左操作数左移指定位数的位模式,空出的位用零填充。此外,如果左操作数是无符号的,则结果是操作数乘以 2 的移位计数次方,并根据类型对某个常量取模进行减少。

未定义行为的原因在 C 中

C 中的未定义行为源于如何处理空出位的问题。在左移操作的情况下,空出的位可以用 1 或 0 填充,但行为应该一致。例如,在表达式-1<<中, 2、空出的位如果用 1 填充,则结果为 -4,但如果用 0 填充,则结果为 4026531840。

右移运算复杂度

另一方面,带有负操作数的右移运算只是实现定义的,而不是未定义的。这是因为空出的位被移出的位填充。在二进制补码表示中,符号位被移出,它只是确定结果是正还是负。该实现可以灵活地决定是否用零或符号位填充空出的位,从而使行为由实现定义。

以上是为什么左移负数在 C 中是未定义的行为,但在 C 中是定义的?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板