2014-03-13 42 views
0
int a=1; 

// a=1 in binary representation 0000 0000 0000 0000 0000 0000 0000 0001 

int b =~a; 1111 1111 1111 1111 1111 1111 1111 1110 

printf("%d",b) 

輸出= -2。補碼32位數據

爲什麼輸出是-2

32位 - 0-31。

第31位有符號位。如果不是+ ve,則有符號位= 0;如果不是-ve,則有1。

由於1移動到了第31位。如果有符號位是1,則不是-ve。那麼爲什麼價值2

我的理解是正確的。如果不引導我

+0

它是實現定義如何表示有符號整數。您不能從標準中得出什麼按位操作對簽名整數做什麼。 –

+1

閱讀[二補](http://en.wikipedia.org/wiki/Two%27s_complement)。這是處理簽名數字的最常見方式。 –

+0

混合**簽名**整數與按位操作('〜')通常是一個壞主意。 – pmg

回答

3

如何計算two's complement

首先我們翻轉所有的位,然後我們加1結果。做到這一點,你會得到2,但由於最高位爲1,結果是否定的:

~0000000111111110,翻轉,你就會得到00000001,現在加1:00000010

0

負數的構建通過按位否定和增加一個

這被稱爲二進制補碼。

如果補碼將用於表示負數,那麼零將有兩個表示,這會使計算複雜化。與二進制補碼你可以簡單地使用正常(至少最多)無符號操作,而不關心數據是否被解釋爲有符號或無符號