這裏是負數按位操作:-20按位上的負數
#include <stdio.h>
main()
{
int a = -20, b = 84;
printf("%d", (a>>(a &b)));
}
2的補二進制1100
和84 10000100
。所以a & b
應該是100
,但答案是68,整體答案是-2。
有人可以向我解釋這個嗎?
這裏是負數按位操作:-20按位上的負數
#include <stdio.h>
main()
{
int a = -20, b = 84;
printf("%d", (a>>(a &b)));
}
2的補二進制1100
和84 10000100
。所以a & b
應該是100
,但答案是68,整體答案是-2。
有人可以向我解釋這個嗎?
如果你使用的是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
-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)