2013-04-20 43 views
-3

這裏是負數按位操作:-20按位上的負數

#include <stdio.h> 

main() 
{ 
    int a = -20, b = 84; 
    printf("%d", (a>>(a &b))); 
} 

2的補二進制1100和84 10000100。所以a & b應該是100,但答案是68,整體答案是-2。

有人可以向我解釋這個嗎?

回答

3

如果你使用的是Windows,它應該帶有一個支持二進制的計算器應用程序。 這是一個很好的可靠的計算資源。 在這裏你可以選擇Word這是一個int。

Negitive號碼在存儲器中由所有的位的左側爲1。注意到這樣-20是

1111-1111-1110-1100 
= 0xFFEC 

和84是:

0000-0000-0101-0100 
= 0x0054 

而且是比較按位操作兩個通過的數字檢查每一位。如果兩個位均爲1,則結果位爲1.否則爲零。所以

1111-1111-1110-1100 
& 0000-0000-0101-0100 
= 0000-0000-0100-0100 
= 68 
4

-20是不是1100 。這是最有可能的(如果整數是32位,我們不是說奇數平臺),11111111111111111111111111101100 。

84不是10000100 。它是1010100 。

取與他們在一起:

11111111111111111111111111101100 
& 
00000000000000000000000001010100 
= 
00000000000000000000000001000100 (68 decimal) 

然後你就換擋-20右側68位,其中有2個問題:

  • 負整數的右移是實現定義,什麼是你的編譯器實施?
  • 偏移通過在值的比特數或超過該結果不確定的行爲

128位整數不大可能上通用平臺。 64位整數很少見,但並非不可能,但對於它們來說,68> = 64,所以你應該得到未定義的行爲。現在

,這個不確定的行爲可能是什麼樣子......

如果我們的整數都是32位的,我們這樣做是x86平臺(或東西足夠相似)上,68應該得到被截斷CPU到5位,留給你的68 & 31 = 4

然後移位數,假設SAR指令(登錄保留算術右移)用於>>,我們得到(-20)SAR 4 = -2:

11111111111111111111111111101100 
SAR 
4 
= 
11111111111111111111111111111110 (-2 decimal)