2009-07-08 32 views
11

在(char)0xff左移8並將其轉換爲int時,我們得到-256或0xffffff00。 有人可以解釋爲什麼會發生這種情況嗎?在C中向左移(char)0xFF 8並將其轉換爲int

#include <stdio.h> 
int main (void) 
{ 
    char c = 0xff; 
    printf("%d %x\n", (int)(c<<8),(int)(c<<8)); 
    return 0; 
} 

輸出是

-256 ffffff00 

回答

14

char可以是有符號或無符號的 - 它是實現定義的。您會看到這些結果,因爲char在您的編譯器上被默認簽名。

對於已簽名的字符0xFF對應-1(這就是兩個補碼的工作方式)。當您嘗試移動它,它首先提升爲int,然後轉向 - 你有效地256

得到乘法因此,它是這樣的代碼:

char c = 0xFF; // -1 
int shifted = c << 8; //-256 (-1 * 256) 
printf("%d, %x", shifted, shifted); 
1

char是什麼,但有符號的字符。所以char c = 0xFF將是-1。當你左移8位時,你會得到-256。

+11

字符的簽名是實現定義的。 – 2009-07-08 10:02:50

3

c爲被晉升爲int前換班操作完成。假設你的實現使得字符被默認簽名,這意味着你將得到0xffffffff,然後向左移動以得到你的結果。

如果你把c變成一個無符號的字符,你應該得到你所期望的。

7

當我第一次看到這個問題時,我最初的觀點是char'c'應該左移8位 - 所有8位被丟棄,然後空char被轉換爲值爲0的int。

一點研究顯示通常的一元轉換 - 這是減少大量算術類型的地方,轉換自動應用於一元'!',' - ','〜'和'*'的操作數運算符分配給二進制'< <'和'>>'運算符的每個操作數。

因此char'c'被轉換爲int 第一個,然後向左移動,給出您看到的答案。

你每天都會學到新的東西!