!是逻辑取反,只涉及到0和非0(非0并没有统一的数值)
~是按位取反,就是数值写成2进制,然后0改成1,1改成0
int a=1;
!a 为0 它只有两种结果 是(非0)和非(0)
~a那可大了去了 这个取反是把该数二进制每一位取反
#include <stdio.h>
int main(){
int a=1;
printf("!a=%d\n",!a);
printf("~a=%d\n",~a);
return 0;
}
对应输出结果如下
!a=0
~a=-2
a=1,~a=-2解释如下
a=1
二进制形式
原码0000 0000 0000 0000 0000 0000 0000 0001
反码0000 0000 0000 0000 0000 0000 0000 0001
补码0000 0000 0000 0000 0000 0000 0000 0001
a=1,~a
以下是a=1时对应的补码
补码0000 0000 0000 0000 0000 0000 0000 0001
以下是a=1时对应的补码,进行按位取反,获得的结果
1111 1111 1111 1111 1111 1111 1111 1110
-2的二进制形式
原码1000 0000 0000 0000 0000 0000 0000 0010
反码1111 1111 1111 1111 1111 1111 1111 1101
补码1111 1111 1111 1111 1111 1111 1111 1110
请注意,编译器自带的二进制运算是按补码进行操作。
故a=1时,~a=-2