2011-07-14 37 views

回答

3

1 << x的一個問題變得很明顯,當您將1移到左側足夠遠時。在具有二進制補碼錶示整數的機器上,這會使值突然變爲負值。假設一個int寬度的32位:

#include <stdio.h> 

int 
main(int argc, const char** argv) 
{ 
    printf("%d\n", (1 << 30)); 
    printf("%d\n", (1 << 31)); 
    printf("%ud\n", (1U << 30)); 
    printf("%ud\n", (1U << 31));   
    return 0; 
} 

我的機器上產生

1073741824 
-2147483648 
1073741824d 
2147483648d 

。這在代碼的其他部分可能是意想不到的。特別是,作爲反向移位不一定是等效的,因爲符號的擴展:

#include <stdio.h> 

int 
main(int argc, const char** argv) 
{ 
    printf("%d\n", (2 << 29) >> 29); 
    printf("%d\n", (2 << 30) >> 30); 
    printf("%u\n", (2U << 29) >> 29); 
    printf("%u\n", (2U << 30) >> 30); 
    return 0; 
} 

產生

2 
-2 
2 
2 

通知他翻轉所述第二輸出線標誌...

+0

如果你需要實現字節算術,總是使用'unsigned'類型。例如'1字節'使用'unsigned char'。 – triclosan

1

這取決於你正在運行的系統。
如果它是一個整數是16位的系統,那麼(1 < < 16)將「離開邊緣」並且數字將爲0.在32位系統上,數字將是2^16(65536)。

由於shift是16,所以如果1是無符號的,它真的沒關係。
但是,如果移位是15,那麼它會更復雜:

無符號的16位整數在移位後的值爲2^15(32768),而有符號的16位整數會具有二進制補碼錶示中的值-2^15(-32768)。

相關問題