左右移操作符

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的结果,可能会导致不可预期的结果。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值