C++/C中!和~的區別與作用
阿新 • • 發佈:2019-01-07
區別:
- !是邏輯運算子(與||,&&是一類符號),表示邏輯取反,可以把非0值變成0,把0值變為1
- ~是位運算子(與|,&是一類符號),表示按位取反,在數值的二進位制表示上,將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可能就不太好理解了,在這裡分析一下。整數在計算機內都是以二進位制補碼錶示的,即如果計算機內有個二進位制串,它會認為這個某個整數的補碼錶示。
我們知道對於正數來說,原碼=反碼=補碼,即符號位固定為0,數值位相同。對於負數來說,負整數的符號位固定為1,求反碼時,原碼符號位1不變,數值位數的每一位求反。反碼符號位1不變,反碼數值位最低位加1,得到補碼。 11110101的最高位是1,這個一個負數的補碼。對於負數來說,原碼=補碼-1,數值為取反。11110101減1得11110100,再對數值為取反得10001011,這就是-11的原碼錶示。原碼是給人看的,計算機記憶體儲的是補碼。最終11110101表示-11。
參考文章: