C语言 ——— 移位操作符

目录

移位

>> --- 右移操作符

右移操作符代码的使用

 代码验证

 算术右移和逻辑右移 

验证Visual Studio使用的是算术右移还是逻辑右移

逻辑右移 or 算术右移的代码验证

右移操作符对正整数有除2的效果(除2是整数除法的除2)

验证

<< --- 左移操作符

 左移操作符移动规则

左移操作符代码的使用

代码验证


移位

  1. 移动的是数据存储在内存中的二进制位,移动的也就是数据的补码
  2. 关于数据补码的相关知识请见:整数的二进制表示形式:原码、反码、补码-CSDN博客
  3. 注意:移位操作符的操作数只能是整数

>> --- 右移操作符

右移操作符代码的使用

int a = 15;

int b = a >> 1;

a >> 1:可理解为a存储在内存中的二进制补码向右移动一个bit位

且a为正整数,所以a的原码、反码、补码是相同的

a向右移一个bit位后,最低位的1就要被舍去,最高位的符号位要补全,补全有两种补全方式,算术右移和逻辑右移,下方会解释


 代码验证

由以上的图画可得知,a向右移一位后赋值给变量b

那么b的值应该为7,因为1*2^0 + 1*2^1 + 1*2^2 = 7

 变量a的值没有改变,由此可得出结论:位移操作符不会改变操作数的值


 算术右移和逻辑右移 

  1. 算术右移:右边丢弃,左边补原来的符号位
  2. 逻辑右移:右边丢弃,左边直接补0
  3. C语言没有给出明确的规定,一般编译器上采用的是算术右移
  4. 注意:丢弃的、操作的、右移的都是数据的补码

验证Visual Studio使用的是算术右移还是逻辑右移

int a = -15;
int b = a >> 1;
printf("b = %d\n", b);

 (-15)存储在变量a中的补码:

当Visual Studio为算数右移后(a >> 1)的结果:

原码最高位是符号位,最高位为1,表示的是负整数,且1*2^3 = 8

 所以(a >> 1)后的算术右移结果为:-8

当Visual Studio为逻辑右移后(a >> 1)的结果:

最高位将会直接补0,那么(a >> 1)后的逻辑右移结果为:8

逻辑右移 or 算术右移的代码验证

由此可见Visual Studio使用的是算术右移 


右移操作符对正整数有除2的效果(除2是整数除法的除2)

关于整数除法的相关知识请见:算数操作符(除法操作符和取模操作符)-CSDN博客

验证

int a = 15;

int b = a >> 1;

int c = b >> 1;


<< --- 左移操作符

 左移操作符移动规则

左边丢弃,右边直接补0(注意:操作的、丢弃的、左移的都是数据的补码)

左移操作符代码的使用

int a = 6;

int b = a << 1;

a的补码以及(a<<1)后的补码:

代码验证

  1. 变量a的值没有被改变,由此得出结论:左移操作符不会改变操作数的值 
  2. 左移操作符对整数有乘2的效果 

写die我了差点,创作不易,麻烦各位大佬点个关注和赞赞(必回关),蟹蟹

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值