!和~的區別(邏輯取反和按位取反)

「已登出」發表於2017-08-25

在c語言中,!和~均表示取反,這兩個的區別在於:

  1. ! :代表邏輯取反,即:把非0的數值變為0,0變為1;
  2. ~ :表示按位取反,即在數值的二進位制表示方式上,將0變為1,將1變為0;
  3. 上述其實可以從java中進行借鑑理解,java中!代表邏輯取反,針對的是boolean型值計算;而~代表數值取反,針對整型值進行計算;

通過如下例子來驗證上述結論:

reverse_not.c

#include<stdio.h>

int main(){
	int a,b,c;
	a = !0;//邏輯運算,0數值轉化為1
	b = !10;//邏輯運算,非0數值轉化為0
	// 按位取反,10的16進製表示為0x00 00 00 0a,取反後為轉化為0xff ff ff f5(這個是補碼)
	// 從補碼往回計算出原碼,得出真值,最高位為1表示為負值,負號後的值為:
	// 0x1 00 00 00 00 - 0xff ff ff f5 = 11,得到-11
	c = ~10;
	printf("%d,%d,%d\n",a,b,c);//運算結果為1,0,-11
}
reverse_not.java
public class reverse_not{
	public static void main(String[] args) {
		// 這裡程式碼報錯,一元運算子,'!' 的運算元型別int錯誤,可見在java中,
		// 規定了!運算子操作
		// System.out.println(!10);
		// 這裡的運算結果和c語言中一致,也是-11,可見在java中也是使用補碼,
		// 並沒有針對做真值取反的所謂優化
		System.out.println(~10);
	}
}

相關文章