原码、反码、补码,以及右移运算符、左移运算符、无符号右移运算符,今天来个一网打尽

原码

原码:一个整数按照绝对值的大小转换成的二进制数,称之为原码。譬如int类型整数5的原码就是00000000 00000000 00000000 00000101【因为int类型占用4个字节,也就是32位】

反码

反码:将二进制数的按位取反,所得到的的新二进制数称为原二进制数的反码。【什么叫取反,取反就是1变0,0变1】

例如5的反码就是11111111 11111111 11111111 11111010

补码

补码:反码加一就是补码,也就是说,要得到一个数,就要得到他的原码,再取反得到反码,反码加一得到补码。那么00000000 00000000 00000000 00000101的补码就是11111111 11111111 11111111 11111011

注意:计算机中,负数以其正值的补码表示

也就是说,-5在计算机中表示为11111111 11111111 11111111 11111011

无符号右移运算符 >>>

无论参与运算的数字是正数还是负数,在运算是都是在高位补0。例如5>>>1,结果为2。那如果是-5,无符号右移之后就变成2147483645。【是不是很夸张🐮】

右移运算符 >>

如果是正数,那么右移运算时是在数的高位补0,但如果是负数,右移运算是在高位补1。如果是5,右移只有变成2,-5>>1之后变成-3。

负数的右移是向下取整,举个例子:-5>>1并不是-2,而是-3,-6右移1位也是-3。

左移 <<

左移运算是移除高位的同时在数的低位补0。左移n位,相当于乘于2n

注意:不管是左移还是右移,如果移动的位数大于该类型的最大位数,编译器会自动对位数取模,例如int类型移动33位,实际上只会移动33%32=1,只会移动1位

posted @   finajoy  阅读(256)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示