C语言的左移和右移



在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变


左移:

             当左移的位数不超过该数值类型的最大位数时:逻辑左移(补0,丢弃最高位)

当左移的位数超过该数值类型的最大位数时:编译器会用左移的位数去模类型的最大位数,然后按余数进行移位(只是执行:左移 所得的余数 个位数)

int i = 1, j = 0x80000000; //设int为32位
i = i << 33;   // 33 % 32 = 1   只左移1位,i变成2
j = j << 33;   // 33 % 32 = 1   只左移1位,j变成0,最高位1被丢弃

右移:>>

              算术右移:保持符号位不变,正数的话补0,负数补1,(补符号位)

int i = 0x80000000;
i = i >> 1;  //i的值不会变成0x40000000,而会变成0xc0000000

                当移动的位数超过类型的长度时,会取余数,然后移动余数个位.


   >>> 向右移动的过程中,不管原来数的最高位是1还是0,都补0,所以我们应该根据需要来选择,右移是用>>>还是>>


参考:http://blog.youkuaiyun.com/tdcs111/article/details/61929445.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值