爲什麼這段代碼進入無限循環?右移運算符無限循環
雖然它可以在其他機器上工作。該機器也是「小端」。 它將繼續打印-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在這裏不相關 –