负操作数上下文中的左移操作和未定义行为
在 C 中,当左侧操作数为负数时,左移操作会调用未定义的行为。根据 ISO C99,仅针对非负符号操作数明确定义了行为。这是由于表示空出的位时可能存在歧义。
C 差异
与 C 不同,C 定义了带有负操作数的左移运算的行为。 C -03 指定结果是左操作数左移指定位数的位模式,空出的位用零填充。此外,如果左操作数是无符号的,则结果是操作数乘以 2 的移位计数次方,并根据类型对某个常量取模进行减少。
未定义行为的原因在 C 中
C 中的未定义行为源于如何处理空出位的问题。在左移操作的情况下,空出的位可以用 1 或 0 填充,但行为应该一致。例如,在表达式-1<<中, 2、空出的位如果用 1 填充,则结果为 -4,但如果用 0 填充,则结果为 4026531840。
右移运算复杂度
另一方面,带有负操作数的右移运算只是实现定义的,而不是未定义的。这是因为空出的位被移出的位填充。在二进制补码表示中,符号位被移出,它只是确定结果是正还是负。该实现可以灵活地决定是否用零或符号位填充空出的位,从而使行为由实现定义。
以上是为什么左移负数在 C 中是未定义的行为,但在 C 中是定义的?的详细内容。更多信息请关注PHP中文网其他相关文章!