2015-07-28 103 views
2

如果char a = -128;它以二進制表示爲10000000字符的奇怪行爲

但是當我將這個二進制等價物轉移到左邊一位時,它給我-256,因爲我的大腦沒有任何意義。

任何人都可以向我解釋這種奇怪的行爲是如何來的嗎?

int main(){ 
char a=-128; 
printf("%d",a<<1); 
return 0; 
} 
+1

整數提升。先閱讀。幾乎所有基於C的語言都使用它,並且在這裏有很多關於它的問題 –

回答

4

按照規則#變速操作者的

整數優惠在每個操作數的執行。 [...]

所以,同時使用a<<1作爲參數爲printf()achar類型和1被的int(文字)的類型,a值被提升到鍵入int,然後,將變速將被執行,那麼結果將被打印出作爲int的值。


[#] - C11,章§6.5.7,按位移位運算

4

-128int變量是0xffffff80

左移的結果是0xffffff00-256

您可以使用此代碼測試:

int main(void) 
{ 
    int n = -128; 

    printf("Decimal value = %d\n", n); 
    printf("Hex value = %x\n", n); 

    n<<=1; 

    printf("Decimal value = %d\n", n); 
    printf("Hex Value = %x\n", n); 

    return 0; 
} 

編輯 在你的代碼printf正在推動您的char變量int轉移之前。

+0

但我認爲OP意味着'char' .....(標題..) –

+0

@SouravGhosh我猜這是錯誤的標題,因爲轉移字符的結果將是0而不是-256。 – LPs

+3

在轉換之前,'char'被提升爲'int'。 –