右移运算符无限循环

Kun*_*are 1 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");
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 7

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

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

您通过无限循环看到的行为是由于该特定实现的右移语义:右移有符号整数保留了符号位.

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

一个例子:

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