2011-04-13 67 views
3

可能重複:
Weird behavior of right shift operator右移 「>>」 在C99

你好

爲什麼從這個功能既號碼印一樣的嗎?這不是一個循環的轉變。

unsigned int i=0x89878685; 
int main() 
{ 
    printf("0x%x\n", i); 
    printf("0x%x\n", i>>32); 
} 

$ ./a.out 
0x89878685 
0x89878685 

是否所有編譯器都以這種方式工作?

回答

10

將32位整數移位32位是未定義的行爲。結果是不可預測的。

在C和C++中,如果整數具有N位,則只允許將位移小於N位。如果您轉移N或更多,則行爲未定義。實際上,當移位32位整數時,某些平臺將簡單地將移位計數解釋爲5位值(丟棄位於下5之上的任何位),這意味着32將被解釋爲與0相同的方式。這顯然是在你的平臺上發生的。該值完全沒有移位。

+0

但在這種情況下主要編譯器是什麼? – osgx 2011-04-13 14:59:25

+8

@osgx:他們無論他們想要什麼,行爲是** undefined **。 – 2011-04-13 15:00:30

+0

但他們通常想要什麼? – osgx 2011-04-13 15:00:58

相關問題