重复移动"x << = 1"后,值是否会为0?

use*_*088 9 c bit-shift

我想知道x在以下程序中是否会达到零.

请考虑:

int main ()
{
    int x = 1;
    while (x)
      {
        x <<= 1;
      }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序的预期行为是正常退出还是永远循环?

Luc*_*ore 18

它们都不是(或两者),它在x溢出时以未定义的行为运行.

C99规范6.5.7节说:

E1 << E2的结果是E1左移E2位位置; 腾出的位用零填充.如果E1具有无符号类型,则结果的值为E1×2 E2,比结果类型中可表示的最大值减少一个模数.如果E1具有带符号类型和非负值,并且E1×2 E2可在结果类型中表示,那么这就是结果值; 否则,行为未定义.

  • 感谢您及时回复.它使用gcc-4.8永远循环,但通常与我尝试过的所有其他编译器一起退出(clang,icc,gcc-4.7). (2认同)
  • @ user1519088你有未定义的行为:) (2认同)
  • +1,虽然为了完整性,可能值得指出`unsigned int`的行为,这可能会回答OP的*预期*问题. (2认同)
  • @ user1519088:已知GCC实现"严格签名溢出语义",这意味着已知导致未定义行为的循环可能被无条件无限循环替换.http://gcc.gnu.org/gcc-4.2/changes.html (2认同)