逻辑移位:移位产生的空位由0来补充,比如11100右移移位变为01110
算术左移同逻辑移位。
算术右移有两种可选的方案:左边移入的位由0补充,或者由符号位来补充,这两种实现依赖于编译器。11100右移移位结果可能是01110或者11110。
在程序中尽量不使用有符号数的右移操作,这样会使得程序的可移植性变差。
对于有符号数右移,下面的代码可以判断编译器采用的逻辑右移还是算术右移
# include <iostream>
# include <cstdlib>
using namespace std;
int main()
{
int a=0xfffffffe;
a>>=1;
if(a==-1)
cout<<"算术移位"<<endl;
else
cout<<"逻辑移位"<<endl;
system("pause");
return 0;
}
由于有符号数左移操作会把符号位移掉,然后在最右边加上0,这可能会使得一个负数变成一个正数。
下面的程序说明了这一点。
# include <iostream>
# include <cstdlib>
using namespace std;
int main()
{
int a=0x80000001; //a<0
cout<<a<<endl;
a<<=1;
cout<<a<<endl; //a>0
system("pause");
return 0;
}