C语言位运算的取反(~)真实原理解析

首先,在了解位运算取反之前,我们要先了解在内存中数据是怎么存储的。
在计算机系统中,数值一律用补码来表示和存储
什么是补码呢?

正整数的补码:是其二进制表示,与原码相同。eg:假设int 型变量为2字节,int a=10,那么a在内存中是按照原码进行存储的,也即0000 0000 0000 1010

负整数的补码:简单记四个字“变反加一”,什么意思呢,举个例子就明白了。int b=-10,想要知道变量b在内存中是怎样存储的
第一步:算10的原码 也即0000 0000 0000 1010
第二步:取反 1111 1111 1111 0101
第三步:加一 1111 1111 1111 0101+1=1111 1111 1111 0110即为-10的补码

好了,铺垫已完成,接下来进入正题
看程序!

#include <stdio.h>
void main(){
int a=10,b;
b=~a;
printf("%d",b);
}
结果为 -11

首先a 是正整数 a的补码就是其原码 0000 0000 0000 1010 (在内存中就是这样存储的),然后~a就是把a按位取反(小魔仙,全身变)变成1111 1111 1111 0101 (内存中也是这样存储的),此时最高位符号位变成了 “1” ,计算机会认为这是一个负数的补码形式。 大家都知道,负数的补码是“变反加一”计算出来的,那么计算机想以%d格式输出~a就需要把1111 1111 1111 0101 逆运算“减一取反”换回来
第一步 “减一” 1111 1111 1111 0101-1=1111 1111 1111 0100
第二步 “取反”(除了符号不取反) 1000 0000 0000 1011 最高位为1,表示负 转化成十进制就是 -11 了

同样的,负数取反的原理也和正数一样

简单的记:不管这个数等于什么,就直接把这个数前面加一个负号,然后再减一就是他的结果! 给你个口诀就是“变号减一” 如 a=100 那么~a就等于-100-1=-101,在如 a=-521,那么~a就等于-(-521)-1=520

第一次写,希望能帮到大家,有什么疑问请在评论留言。哈哈~

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java精灵儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值