移位操作符 <<和>>

有任何不懂的问题可以评论区留言,能力范围内都会一一回答

今天我们学习位移操作符

主要分为<<左移操作符和>>右移操作符,需要注意的是移位操作符的操作数只能是整数

1,左移操作符

规则:左边抛弃,右边补0

举个例子

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void) {
	char num = 55;
	char total = -83;
		char n = num << 1;
		char m= total<< 1;
		printf("%d\n", num);
		printf("%d\n", n);
		printf("%d\n", total);
		printf("%d\n", m);
		return 0;
}

思考一下这串代码运算结果是什么?

首先我们要知道这个地方num是char类型的,也就意味着大小是1个字节,及8个比特位

其次我们要明确的是位操作符是争对补码进行运算的

好,我们先看num通过左移1位后得到n,但是本身还是55,说明

移位操作符不会改变它作用的数的值

那么上图的n是怎么得来的呢?首先移位操作符是争对补码计算的

因为55是正数(原码补码反码相同)

所以55的补码是              00110111

然后左移一位右边补0    001101110

红色的0是左移导致丢失的一位,蓝色0是右边补的一位

但是打印我们是十进制整数,这个地方补码代表的十进制整数就是110

我们再算一个total的值是-83

补码就是                  10101101

左移右边补0得到    101011010

得到的补码就是       01011010

换算成十进制整数就是90

刚好代码运行结果和我们运算得到的是一致的,总之,左移操作符两点

(1) ,左移操作符是争对补码进行运算的,但是printf是对有符号十进制整数,因此中间我们要去换算

(2),左移操作符的作用效果是补码整体的二进制序列向左移一位,右边空的位补0;左边溢出位截断舍去

2.右移操作符

右移操作符也是两点

(1)第一点和左移操作符是一样的,右移操作符是争对补码进行运算的,但是printf是对有符号十进制整数,因此中间我们要去换算

(2)但是第二点就有所不同了,右移操作符像右移动一位后,但是因为左边溢出被截断的位是符号位,就左边空出的符号位补0还是1出现了两种方式

第一个就是逻辑右移:左边用0补充,右边丢弃

第二个就是算术右移:左边用原该值的符号位补充,右边丢弃

但是具体是用逻辑位移还是算术右移是取决于编译器的!

大部分编译器采用的是算术右移

那我们就以上面的num和total就这两种位移方式计算一下

逻辑右移:

55的补码是                00110111

右移一位左边补0       000110111

得到的补码就是00011011

换算成十进制整数就是27

-83的补码是                 10101101

右移一位左边补0          010101101       

得到的补码就是            01010110

换算成十进制整数就是42

算术右移:

55的补码是                                   00110111

右移一位左边补0(符号位是0)       000110111

得到的补码就是                            00011011

换算成十进制整数就是27

-83的补码是                                     10101101

右移一位左边补1(符号位是1)          110101101 

 得到的补码就是                              11010110  

换算成十进制整数就是-42

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void) {
	char num = 55;
	char total = -83;
		char n = num >> 1;
		char m= total>> 1;
		printf("%d\n", num);
		printf("%d\n", n);
		printf("%d\n", total);
		printf("%d\n", m);
		return 0;
}

博主用的是vs2022,从结果来看,该编译器采用的是算术位移

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

最后用思维导图做个总结

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值