逻辑左移和算术左移,都是在右边补0,效果一样。左移1bit,相当于原数 乘以2。
逻辑右移:右移后,左边补0
算术右移:右移后,左边补符号位,添加的位与原数的符号位相同,正数(0算作正数的一个)补0,负数补1。算术右移1bit,相当于原数 除以2。
C/C++中,对于无符号数,可以认为是逻辑左移和逻辑右移。对于有符号数,可以认为是算术左移和算术右移,
要对一个有符号数 执行逻辑右移,可以先将它强制类型转换为无符号类型。
要对一个无符号数 执行算术右移,可以先将它强制类型转换为有符号类型。
参考:https://blog.csdn.net/wait_nothing_alone/article/details/79516552
#include "stdio.h"
int main(int argc, char** argv)
{
int a = 0xfffffffe; // -2
int b = a >> 1; //signed, arithmetic shift right
int c = (unsigned int)a >> 1; //unsigned, logic shift right
printf(" b = 0x%x (%d) \n", b,b); // b = a /2 = -1
printf(" c = 0x%x (%d) \n", c,c);
unsigned int d = 0xfffffffe; //
unsigned int e = d >> 1; //unsigned, logic shift right
unsigned int f = (int)d >> 1; //signed, arithmetic shift right
printf(" e = 0x%x (%d) \n", e,e);
printf(" f = 0x%x (%d) \n", f,f);// f = d /2 = -1
return 0;
}
b = 0xffffffff (-1)
c = 0x7fffffff (2147483647)
e = 0x7fffffff (2147483647)
f = 0xffffffff (-1)