2011-08-11 90 views
1

誰能解釋爲什麼下面的代碼輸出它做什麼:符號 - 無符號轉換

char c = -1; 
cout << (c << 8) << endl; 
cout << ((unsigned char) c << 8) << endl; 
cout << (c << 24) << endl; 
cout << ((unsigned char) c << 24) << endl; 

輸出:

-256 
65280 
-16777216 
-16777216 

我以爲鑄造unsigned char類型會簡單地改變位獲得方式解釋。但是,當向左移動8時,結果發生了變化。奇怪的是,當向左移動24時,情況似乎不是這樣。

回答

3

在每種情況下,角色都會在升級到int之前調動,轉移。

在你的平臺上,char簽訂,所以c-1,但(unsigned char)(c)爲255

所以你看到:

  • -1 << 8
  • 255 << 8
  • -1 << 24
  • 255 << 24

請注意,後者溢出幷包裹(在您的平臺上)。它不同於255U << 24,它是4278190080.要達到這個目標,你必須說(unsigned int)(unsigned char) c << 24