这篇文章详细讲解一下C语言中的移位操作符。
一起来学习吧!!!
首先,给大家说明一点,移位操作符的操作数只能是整数,移位移动的是二进制位(当然整数在内存中存的是补码)。
🌁 1.左移操作符(<<)
首先我们来看左移操作符,<<:
左移操作符的移位规则是:
左边抛弃、右边补0
我们来举个例子:
#include <stdio.h> int main() { int a = 10; int b = a << 1; printf("%d", b); return 0; }
大家可以按照上面的移动规则自己算一下,看看结果是什么。
好,那现在我们一起来分析一下:
那结果是不是20 呢?我们来看一下:
另外提醒一下,对a进行移位之后,a在不被赋值的情况下(a=a<<1),a自身的值不会发生变化。
我们可以打印一下看看:
好,刚才是对正数进行移位,我们再来移一个负数试试:
int main() { int a = -2; int b = a << 1; printf("%d", b); return 0; }
一起分析一下:
是-4吗?
做了两道题之后,我们好像可以发现一个规律:
对整数左移一位,相当与乘了一个2:
10左移一位结果是20;
-2左移一位结果是-4;
那左移操作符我们学会了,接下来我们来看右移操作符。
⛄️ 2.右移操作符(>>)
对于右移操作符,它的移位规则分为两种:
(1)算术右移
右边丢弃,左边补原符号位
上例子:
int main() { int a = -1; int b = a >> 1; printf("%d", b); return 0; }
在这里给大家提一下,在我使用的vs2022这个编译器上采用的就是算术右移(大部分编译器都是算术右移)。
那我们按照算术右移来分析一下结果是什么:
看看vs2022的结果:
这是算术右移,接着我们看逻辑右移。
(2)逻辑右移
右边丢弃,左边补0
那还是这个代码:
int main() { int a = -1; int b = a >> 1; printf("%d", b); return 0; }
现在我们用逻辑右移来分析一下:
我们看看转换为10进制是几:
因为我们的编译器是算术右移,所以没法验证,大家知道就行了
最后,再给大家提醒一点:
警告⚠ :
对于移位运算符,不要移动负数位,这个是标准未定义的。
比如:
以上就是移位操作符的全部内容,欢迎大家指正!!!