900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > C语言位运算的取反(~)真实原理解析

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

时间:2024-04-20 19:20:02

相关推荐

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。