2015-07-20 86 views
1

爲什麼這段代碼進入無限循環?右移運算符無限循環

雖然它可以在其他機器上工作。該機器也是「小端」。 它將繼續打印-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"); 
} 
+0

與[Shift運算符在C](http://stackoverflow.com/q/7622/1708801) –

+0

Endianness在這裏不相關 –

回答

7

從C標準(見6.5.7 按位的移位運算符):

E1的結果>> E2E1右移E2位位置。如果E1具有無符號類型 或者如果E1具有符號類型和具有非負值,則結果的值是E1/2 E2的商的整數部分 。 如果E1具有帶符號的類型和負值,則結果值是實現定義的。

你與一個無限循環看到的行爲是由於特定的實現存在的右移語義:右移一個符號整數保留符號位。

因此,對於任何負面輸入,您最終都會以0xffffffff...(== -1)結束,並且始終滿足繼續執行循環的條件。

一個例子:

原始輸入:            0x80000000
後一個移位:          0xC0000000
2後移:      0xE0000000
後三班:  0xF0000000
四後的變化:      0xF8000000

+0

請問您能否請告訴我們它是如何適用於其他機器的? –

+0

在_what_其他機器上?併爲哪個編譯器? – Michael

+0

我只是從OP擴展了這個問題。 –

0

右移有符號整數將保留符號位。這是適用於此的規則,導致上述行爲