为什么这段代码进入无限循环?右移运算符无限循环
虽然它可以在其他机器上工作。该机器也是“小端”。 它将继续打印-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");
}
为什么这段代码进入无限循环?右移运算符无限循环
虽然它可以在其他机器上工作。该机器也是“小端”。 它将继续打印-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");
}
从C标准(见6.5.7 按位的移位运算符):
E1的结果>> E2是E1右移E2位位置。如果E1具有无符号类型 或者如果E1具有符号类型和具有非负值,则结果的值是E1/2 E2的商的整数部分 。 如果E1具有带符号的类型和负值,则结果值是实现定义的。
你与一个无限循环看到的行为是由于特定的实现存在的右移语义:右移一个符号整数保留符号位。
因此,对于任何负面输入,您最终都会以0xffffffff...
(== -1)结束,并且始终满足继续执行循环的条件。
一个例子:
原始输入: 0x80000000
后一个移位: 0xC0000000
2后移: 0xE0000000
后三班: 0xF0000000
四后的变化: 0xF8000000
等
右移有符号整数将保留符号位。这是适用于此的规则,导致上述行为
与[Shift运算符在C](http://stackoverflow.com/q/7622/1708801) –
Endianness在这里不相关 –