逻辑移位:移位产生的空位由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; }
原文地址:http://blog.csdn.net/u011608357/article/details/38767955