c语言中移位操作符的试验

c语言中有两个移位操作符——左移位“<<”和右移位">>".它们可以将一个值向左移和向右移。在左移位中,值最左边的被丢弃,而右边多出来的几个空位由0补齐。而右移在操作符同样,只是方向不同。一下例子以左移位操作符讲解。

猜想:

1若是移位数为负数怎么办,移还是不移?例如a>> -5,看下面代码实验

代码1:

#include <stdio.h>

int main(int argc, char **argv)
{
	int a=3;
	printf("%d",a<<-5);
	return 0;
}


运行效果:


它是移了多少位呢?可以算出得到为左移27位。这个值为什么是这样的?不是移26或者25位。int是整型,一般 大多是32位的,所以可以看出移位数为负数的话那么真实移位数是32+负数。可以编个代码试试对不对;

代码2:

[cpp]  view plain copy
  1. <span style="font-size:18px;">#include <stdio.h>  
  2.   
  3. int main(int argc, char **argv)  
  4. {  
  5.     int a=1;  
  6.     printf("%d",a<<27);  
  7.     return 0;  
  8. }  
  9. </span>  
 运行效果:


代码2中是将1移位27位则刚好和移位-5是相同结果。看官也可以试试别的数字和移位数

2若移位数本身大于操作数所占位数改如何?编个代码试试便知

[cpp]  view plain copy
  1. #include <stdio.h>  
  2.   
  3. int main(int argc, char **argv)  
  4. {  
  5.     int a=3;  
  6.     printf("%d",a<<33);  
  7.     return 0;  
  8. }</span>  
 运行效果:


上面代码所示将3左移位33位结果是6,为什么?以下结果为将代码改为a<<32,a<<34;



若是在改大些呢?以下为a<<64,a<<65,a<<66的结果



现在结果出来了,左移位的位数=a-32

由上面猜想可以得到移位的公式:实际移位数b=a-32*k;

右移也应该和左移一样。


注:以上试验基于gcc4.6.2 编译器所做。而实际移位数基于操作数的最大位数所得,故系统环境,编译器不同,实际移位数还是不同。所以基于移位操作符的程序移植难度较大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值