首先需要明确一点,计算机中的二进制数都是用其补码表示的,所有的移位运算都是在补码的表示形式上进行操作的,无符号数的补码是其本身,有符号数的补码是符号位不变,其他位求反加1。这里说的很清楚。
无符号数
左移:高位移出,低空位补0。相当于乘以2的n次方
当左移一定位数时,最高位变为1,这时计算机会认为这是一个负数的补码,这时你输出一下计算机就会显示一个负数。如果左移位数超过int类型数值的位数,则会显示为0,因为低空位是用0填补的.比如
int b = (9<<28);
cout<<b<<endl;
int b_ = (9<<32);
cout<<b_<<endl;
右移:低位移出,高空位补0。相当于除以2的n次方
当右移位数超过二进制数字的表示位数时,结果就会变成0,再怎么右移也不会再变,因为会变成0x00000000,也就是0的补码。比如
int b_ = (9>>5);
cout<<b_<<endl;
有符号数
左移:高位移出,低空位补0。
同样的道理,当左移一定位数时,最高位变为0,这时计算机会认为这是一个正数的补码,这时你输出一下计算机就会显示一个正数。如果左移位数超过int类型数值的位数,则会显示为0,因为低空位是用0填补的.比如
int b = (-9<<23);
cout<<b<<endl;
int b_ = (-9<<28);
cout<<b_<<endl;
int b__ = (-9<<32);
cout<<b__<<endl;
右移:低位移出,高空位补1。
当右移位数超过二进制数字的表示位数时,结果就会变成-1,再怎么右移也不会再变,因为最后会变成这个数0xFFFFFFFF,这就是-1的补码,所以不会再变。比如
int b = (-9>>1);
int b_ = (-9>>5);
cout<<b<<endl;
cout<<b_<<endl;