前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C操作符详解】之 移位操作符

【C操作符详解】之 移位操作符

作者头像
YIN_尹
发布2024-01-23 15:37:42
6680
发布2024-01-23 15:37:42
举报
文章被收录于专栏:YIN_尹的博客YIN_尹的博客

首先,给大家说明一点,移位操作符的操作数只能是整数,移位移动的是二进制位(当然整数在内存中存的是补码)。

🌁 1.左移操作符(<<)

首先我们来看左移操作符,<<:

左移操作符的移位规则是:

左边抛弃、右边补0

我们来举个例子:

代码语言:javascript
复制
#include <stdio.h>
int main()
{
	int a = 10;
	int b = a << 1;
	printf("%d", b);
	return 0;
}

大家可以按照上面的移动规则自己算一下,看看结果是什么。

好,那现在我们一起来分析一下:

在这里插入图片描述
在这里插入图片描述

那结果是不是20 呢?我们来看一下:

在这里插入图片描述
在这里插入图片描述

另外提醒一下,对a进行移位之后,a在不被赋值的情况下(a=a<<1),a自身的值不会发生变化。

我们可以打印一下看看:

在这里插入图片描述
在这里插入图片描述

好,刚才是对正数进行移位,我们再来移一个负数试试:

代码语言:javascript
复制
int main()
{
	int a = -2;
	int b = a << 1;
	printf("%d", b);
	return 0;
}

一起分析一下:

在这里插入图片描述
在这里插入图片描述

是-4吗?

在这里插入图片描述
在这里插入图片描述

做了两道题之后,我们好像可以发现一个规律:

对整数左移一位,相当与乘了一个2:

10左移一位结果是20; -2左移一位结果是-4;

那左移操作符我们学会了,接下来我们来看右移操作符。

⛄️ 2.右移操作符(>>)

对于右移操作符,它的移位规则分为两种:

(1)算术右移

右边丢弃,左边补原符号位

上例子:

代码语言:javascript
复制
int main()
{
	int a = -1;
	int b = a >> 1;
	printf("%d", b);
	return 0;
}

在这里给大家提一下,在我使用的vs2022这个编译器上采用的就是算术右移(大部分编译器都是算术右移)。

那我们按照算术右移来分析一下结果是什么:

在这里插入图片描述
在这里插入图片描述

看看vs2022的结果:

在这里插入图片描述
在这里插入图片描述

整数算术右移一位相当于除以2并向下取整。(大家可以自己多试几个)

这是算术右移,接着我们看逻辑右移。

(2)逻辑右移

右边丢弃,左边补0

那还是这个代码:

代码语言:javascript
复制
int main()
{
	int a = -1;
	int b = a >> 1;
	printf("%d", b);
	return 0;
}

现在我们用逻辑右移来分析一下:

在这里插入图片描述
在这里插入图片描述

我们看看转换为10进制是几:

在这里插入图片描述
在这里插入图片描述

因为我们的编译器是算术右移,所以没法验证,大家知道就行了

最后,再给大家提醒一点:

在这里插入图片描述
在这里插入图片描述

警告⚠ :

对于移位运算符,不要移动负数位,这个是标准未定义的。

比如:

在这里插入图片描述
在这里插入图片描述

最后呢要给大家说明一下:

左移右移一定是向左、向右两个方向移动吗? 左移其实是向高位移动,右移其实是向低位移动,只不过一般情况下左边就是高位,右边就是低位,所以起名为左移右移,符合我们的正常习惯。

以上就是移位操作符的全部内容,欢迎大家指正!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🌁 1.左移操作符(<<)
  • ⛄️ 2.右移操作符(>>)
    • (1)算术右移
      • (2)逻辑右移
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档