1.逻辑取反(!)
首先看看下面这个代码:
#include <stdio.h>
int main()
{
int flag = 0;
if(!flag)//
{
printf("Hello World\n");
}
}
我们定义了一个变量flag = 0,!flag的意思就是对flag进行逻辑取反,意思就是说如果你时大于0的数,就会被取反成0,反之,如果flag等于0,就会取反变成1,因此上面代码!flag=1,满足if判断条件
2.逻辑取反(~)
#include <stdio.h>
int main()
{
int flag = 0;
if(~flag)//
{
printf("Hello World\n");
}
}
我们将上面!flag改成~flag,发现输出的结果一样,那~按位取反究竟是什么意思呢?
我们定义了一个 int flag = 0,int表示4个字节大小,1个字节 = 8个比特位,所以4个字节 = 32个比特位,表示出来就是 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0一共有32个0,它的补码也是 00000000一共32个0(int 类型在计算机中是以补码的形式存储的),按位取反就是将这32个0均变成正数1111111111111一共32个,因此也满足if判断条件
3.举个例子
那么如果是-1呢?-1的原码为 100000000001一共32位,中间省略了一些0,第一位是符号位,负数为1,正数为0,它的反码就是111111111111110一共32位,补码(补码为反码基础上+1,反码即为原码除符号位全部取反)为1111111111111111一共32位,于是对补码进行按位取反~就能得到000000000000000一共32位,即-1的补码为0
如上图所示
感谢各位老爷能看到这里,如有不对,请在评论区指出,谢谢大家