2012-06-06 92 views
-1

這是代碼:爲什麼輸出總是-1?

char x=-1>>2; 
printf("%d",x); 

就算我x = -N>>2它只會給1

x = -1 => 11111111 
x= -1>>2 ==> 00111111 = 3F ?? 

而且即便我做了詮釋x = -1>>2輸出將1

你能解釋一下這個計算是如何進行的嗎?

回答

1

我相信,如果你使用

unsigned char x=-1>>2; 

對於有符號數(包括字符)您的代碼將工作,右移不追加零。這稱爲符號位擴展。 C使用2的補碼形式來存儲負數。對於負數,符號位(MSB)在此操作中填充的形式爲1。使用無符號數字將解決問題。

3

負值的右移是實現定義的。

在你的情況下,你所看到的右移的行爲是保持符號。

考慮char x = -38;。下面演示的位位移保留標誌時是如何工作的:

x  11011010 
x >> 1 11101101 
x >> 2 11110110 
x >> 3 11111011 
etc... 
+0

要變得迂腐,它是正確的*負值的轉移*是實現定義的... –

+0

謝謝,我已經修復它。 –