int main()
{
int a = 2;
int b = a << 1; //左移操作符<<---移动的是二进制位--把 1 0 向前移一个成 1 0 0,右侧最后一位补0
//expr >> n;//右移操作符>>,二进制向右移动n位,左侧用0填充
printf("%d\n",b);
return 0;
}
1.左移操作符不会对表达式进行符号扩展,因此对于负数的左移操作,会保留其符号位。例如,对于一个有符号整数变量b,执行b << 2的操作会将b的二进制表示向左移动2位,并在右侧用0填充,得到b * 4的结果,如果b是负数,则结果也是负数。
需要注意的是,左移操作符可能会导致溢出。例如,对于一个有符号整数变量b,如果执行b << 31的操作,会导致符号位和进位位都为1,从而产生溢出。在这种情况下,C语言的行为是未定义的,因此需要避免这种情况的发生。
2.对于有符号整数类型,右移操作符会先将expr转换为无符号整数,然后再执行右移操作。因此,对于负数的右移操作,可能会导致不可预期的结果。为了避免这种情况,可以使用逻辑右移操作符">>=",它的行为与普通的右移操作符相同,但是对于负数的右移操作会进行符号位扩展,而不是截断。
例如,对于一个无符号整数变量a,执行a >> 2的操作会将a的二进制表示向右移动2位,得到a/4的结果。而对于一个有符号整数变量b,执行b >> 2的操作会将b的二进制表示向右移动2位,并在左侧用符号位扩展,得到b/4的结果,可能会导致不可预期的结果。