2012-11-07 114 views
3

我一直在對變量執行按位運算。在按位運算符中的說明

int p=3,q=5; 
int a=~p,b=~q; //complement a and b 
printf("%d %d\t%d %d",p,a,q,b); 

'b'的理論輸出是10,如果它是有符號的,它必須是-2。 但輸出是-6。

有人可以解釋我的工作嗎?

+5

爲什麼「b的理論輸出值」10? – Mat

+0

我編輯它。現在一切都好了。 –

+4

對於你的*「理論10」*記住'int'不僅僅是4位大小(提示:在按位NOT下前導零發生了什麼?)。 –

回答

7

~是c(或python)中的按位互補運算符,它基本上計算-x - 1

所以一臺看起來像:

0 -1 
1 -2 
2 -3 
3 -4 
4 -5 
5 -6 

在二進制補碼錶示,如果一個數x的最顯著位爲1,則實際值是 - (〜X + 1)。

例如,

0b11110000 = -(~0b1111 + 1) = -(15 + 1) = -16. 

這是負數的自然表示,因爲

0000001 = 1 
0000000 = 0 
1111111 = -1 (wrap around) 
1111110 = -2 
1111101 = -3 etc. 

http://en.wikipedia.org/wiki/Two%27s_complement參見詳細。

+1

它不一定是C中的二進制補碼 - 它被定義爲補全所有符號和值位,以及實現是否使用二進制補碼,補碼或符號大小是實現定義的。 – caf

3

p是0b11,所以a會(假設16位整數)0b1111111111111100 = 0xFFFC如果無符號和-3如果有符號。

q是0b101,所以b會(假設爲16位整數)0b1111111111111010 = 0xFFFA如果是無符號的,則爲-6(如果有符號)。

+3

寫32時你忘了一串1和F或者你的意思是16。 –

+0

WHOOPS!你是對的。雖然我更喜歡32位,我使用16使它更具可讀性...... – glglgl

+0

@unknownDownvoter但這真的是-1的原因嗎?我想這個意圖已經足夠清晰了...... – glglgl

1

在補充p(即5)的同時,你期待它是1010.即10.但事實是在補碼操作期間,所有比特都被反轉。

請考慮這個程序。

#include <stdio.h> 

int main() 
{ 

int p=5,q=3; 
int a=~p,b=~q; //complement a and b 
printf("%x %x\t%x %x",p,a,q,b); 

return 0; 
} 

打印

5 fffffffa 3 fffffffc 

所以,同時使用%d打印時,符號被考慮。