1. 程式人生 > >C++/C中!和~的區別與作用

C++/C中!和~的區別與作用

區別:

  1. !是邏輯運算子(與||,&&是一類符號),表示邏輯取反,可以把非0值變成0,把0值變為1
  2. ~是位運算子(與|,&是一類符號),表示按位取反,在數值的二進位制表示上,將0變為1,將1變為0

例子:

#include<iostream>
using namespace std;

int main(){
	int a = 10;
	int b = 0;
	cout << "a:" << a << ",a的邏輯反是:" << !a << endl;
	cout <<
"b:" << b << ",b的邏輯反是:" << !b << endl; cout << "a:" << a << ",a的位反是:" << ~a << endl; cout << "b:" << b << ",b的位反是:" << ~b << endl; return 0; }

結果:
在這裡插入圖片描述
解釋:
a=10,a的邏輯反是0,很容易理解,但是a的按位取反為什麼是-11可能就不太好理解了,在這裡分析一下。整數在計算機內都是以二進位制補碼錶示的,即如果計算機內有個二進位制串,它會認為這個某個整數的補碼錶示。

假設使用使用8位二進位制來表示int,最高位是符號位,則10的二進位制形式是00001010,按位取反後是11110101,根據前面的解釋可以知道,這是一個數字的補碼。
我們知道對於正數來說,原碼=反碼=補碼,即符號位固定為0,數值位相同。對於負數來說,負整數的符號位固定為1,求反碼時,原碼符號位1不變,數值位數的每一位求反。反碼符號位1不變,反碼數值位最低位加1,得到補碼。 11110101的最高位是1,這個一個負數的補碼。對於負數來說,原碼=補碼-1,數值為取反。11110101減1得11110100,再對數值為取反得10001011,這就是-11的原碼錶示。原碼是給人看的,計算機記憶體儲的是補碼。最終11110101表示-11。

參考文章:

  1. 原碼、反碼、補碼之間的轉換和簡單運算
  2. !和~的區別(邏輯取反和按位取反)