逻辑取反(!)和按位取反(~)的区别

 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

如上图所示


感谢各位老爷能看到这里,如有不对,请在评论区指出,谢谢大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值