如果char a = -128;
它以二進制表示爲10000000
。字符的奇怪行爲
但是當我將這個二進制等價物轉移到左邊一位時,它給我-256
,因爲我的大腦沒有任何意義。
任何人都可以向我解釋這種奇怪的行爲是如何來的嗎?
int main(){
char a=-128;
printf("%d",a<<1);
return 0;
}
如果char a = -128;
它以二進制表示爲10000000
。字符的奇怪行爲
但是當我將這個二進制等價物轉移到左邊一位時,它給我-256
,因爲我的大腦沒有任何意義。
任何人都可以向我解釋這種奇怪的行爲是如何來的嗎?
int main(){
char a=-128;
printf("%d",a<<1);
return 0;
}
按照規則#變速操作者的,
整數優惠在每個操作數的執行。 [...]
所以,同時使用a<<1
作爲參數爲printf()
,a
感char
類型和1
被的int
(文字)的類型,a
值被提升到鍵入int
,然後,將變速將被執行,那麼結果將被打印出作爲和int
的值。
[#] - C11
,章§6.5.7,按位移位運算
-128
上int
變量是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
轉移之前。
但我認爲OP意味着'char' .....(標題..) –
@SouravGhosh我猜這是錯誤的標題,因爲轉移字符的結果將是0而不是-256。 – LPs
在轉換之前,'char'被提升爲'int'。 –
整數提升。先閱讀。幾乎所有基於C的語言都使用它,並且在這裏有很多關於它的問題 –