您的位置:首页 > 编程语言 > C语言/C++

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

2013-07-24 17:41 211 查看
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
plaincopy

<span style="font-size:18px;">#include <stdio.h>

int main(int argc, char **argv)

{

int a=1;

printf("%d",a<<27);

return 0;

}

</span>

运行效果:



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

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

[cpp] view
plaincopy

#include <stdio.h>

int main(int argc, char **argv)

{

int a=3;

printf("%d",a<<33);

return 0;

}</span>

运行效果:



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





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







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

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

右移也应该和左移一样。

注:以上试验基于gcc4.6.2 编译器所做。而实际移位数基于操作数的最大位数所得,故系统环境,编译器不同,实际移位数还是不同。所以基于移位操作符的程序移植难度较大
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: