這是代碼:爲什麼輸出總是-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?
char x=-1>>2;
printf("%d",x);
就算我x = -N>>2
它只會給1
。
x = -1 => 11111111
x= -1>>2 ==> 00111111 = 3F ??
而且即便我做了詮釋x = -1>>2
輸出將1
。
你能解釋一下這個計算是如何進行的嗎?
我相信,如果你使用
unsigned char x=-1>>2;
對於有符號數(包括字符)您的代碼將工作,右移不追加零。這稱爲符號位擴展。 C使用2的補碼形式來存儲負數。對於負數,符號位(MSB)在此操作中填充的形式爲1。使用無符號數字將解決問題。
負值的右移是實現定義的。
在你的情況下,你所看到的右移的行爲是保持符號。
考慮char x = -38;
。下面演示的位位移保留標誌時是如何工作的:
x 11011010
x >> 1 11101101
x >> 2 11110110
x >> 3 11111011
etc...
要變得迂腐,它是正確的*負值的轉移*是實現定義的... –
謝謝,我已經修復它。 –