C语言位运算的取反(~)真实原理解析「终于解决」

C语言位运算的取反(~)真实原理解析「终于解决」首先,在了解位运算取反之前,我们要先了解在内存中数据是怎么存储的。在计算机系统中,数值一律用补码来表示和存储。什么是补码呢?正整数的补码:是其二进制表示,与原码相同。eg:假设int型变量为2字节,inta=10,那么a在内存中是按照原码进行存储的,也即0000000000001010负整数的补码:简单记四个字“变反加一”,什么意思呢,举个例子就明白了。intb=-10,想要知道变量b在内存中是怎样存储的第一步:算10的原码也即0000000000001010第二步:取反1

大家好,欢迎来到IT知识分享网。

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

正整数的补码:是其二进制表示,与原码相同。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

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24278.html

(0)
上一篇 2023-08-24 18:33
下一篇 2023-08-26 19:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信