我一直在對變量執行按位運算。在按位運算符中的說明
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。
有人可以解釋我的工作嗎?
我一直在對變量執行按位運算。在按位運算符中的說明
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。
有人可以解釋我的工作嗎?
~
是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.
它不一定是C中的二進制補碼 - 它被定義爲補全所有符號和值位,以及實現是否使用二進制補碼,補碼或符號大小是實現定義的。 – caf
在補充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打印時,符號被考慮。
爲什麼「b的理論輸出值」10? – Mat
我編輯它。現在一切都好了。 –
對於你的*「理論10」*記住'int'不僅僅是4位大小(提示:在按位NOT下前導零發生了什麼?)。 –