在(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
在(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
char
可以是有符號或無符號的 - 它是實現定義的。您會看到這些結果,因爲char
在您的編譯器上被默認簽名。
對於已簽名的字符0xFF對應-1(這就是兩個補碼的工作方式)。當您嘗試移動它,它首先提升爲int
,然後轉向 - 你有效地256
得到乘法因此,它是這樣的代碼:
char c = 0xFF; // -1
int shifted = c << 8; //-256 (-1 * 256)
printf("%d, %x", shifted, shifted);
char是什麼,但有符號的字符。所以char c = 0xFF將是-1。當你左移8位時,你會得到-256。
c爲被晉升爲int前換班操作完成。假設你的實現使得字符被默認簽名,這意味着你將得到0xffffffff,然後向左移動以得到你的結果。
如果你把c變成一個無符號的字符,你應該得到你所期望的。
當我第一次看到這個問題時,我最初的觀點是char'c'應該左移8位 - 所有8位被丟棄,然後空char被轉換爲值爲0的int。
一點研究顯示通常的一元轉換 - 這是減少大量算術類型的地方,轉換自動應用於一元'!',' - ','〜'和'*'的操作數運算符和分配給二進制'< <'和'>>'運算符的每個操作數。
因此char'c'被轉換爲int 第一個,然後向左移動,給出您看到的答案。
你每天都會學到新的東西!
字符的簽名是實現定義的。 – 2009-07-08 10:02:50