右移运算符无限循环

时间:2015-07-20 11:38:22

标签: c bit-shift

为什么这段代码会进入无限循环?

虽然它可以在其他机器上运行。机器也是'小端。 它将继续打印-1值;

void printfbit(int n)
{
    while (n) {
        if (n & 1)
            printf("1");
        else
            printf("0");
        n = n >> 1;
        printf("\t %d\n",n);
    }
    //printf("\n");
}

2 个答案:

答案 0 :(得分:7)

从C标准(参见6.5.7 按位移位运算符一节):

  

E1>>的结果E2 E1 右移 E2 位位置。如果 E1 具有无符号类型   或者如果 E1 具有有符号类型和非负值,则结果的值为积分   部分商 E1 / 2 E2 如果E1有签名类型和负值,则   结果值是实现定义的。

您在无限循环中看到的行为是由于该特定实现的右移语义:正确移位有符号整数会保留符号位。

因此,对于任何负面输入,您最终会以0xffffffff...(== -1)结束,并且将始终满足继续循环的条件。

一个例子:

原始输入:0x80000000
一班后:0xC0000000
两班后:0xE0000000
三班后:0xF0000000
四班后:0xF8000000

答案 1 :(得分:0)

右移有符号整数将保留符号位。这就是这里应用的规则,导致上述行为