大家好,欢迎来到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