算术移位和逻辑移位


1. 算术移位和逻辑移位的概念
  • 算术移位:右移时要考虑符号位

  • 逻辑移位:缺少的数字用 0填充


2. 有符号/无符号整数的移位
  • 无符号数:算术移位和逻辑移位相同,不论左移右移,缺少的位都用’0’补上

  • 有符号数:

    • 左移:属于逻辑移位,补’0

    • 右移:属于算术移位,补’符号位


3. 常量和变量的移位
  • 常量:

    • 左移:正常移位,超过位数限制,变为0
    • 右移:正数正常移位,超过位数限制变为0;负数超过位数限制只能为-1
  • 变量:

    • 左移:按照“移动位数 % 位数限制”,如”移动位数 % int 32位”
    • 右移:正数正常移位,超过位数限制变为0;负数超过位数限制只能为-1
#include <stdio.h>

int main()
{
    int a = 3;
    int b = -2;
    printf("%d %d\n", a << 31, a << 32);
    printf("%d %d %d\n", a >> 2, b >> 1, b >> 4);
    printf("%d %d %d\n", 1 << 32, 1 << 31, 1 >> 1);
    printf("%d %d %d\n", -4 >> 4, -1 << 31, -1 << 32);
    return 0;
}

输出:

-2147483648 3            //变量正数:左移31位,int有符号表示最小负数; 左移32位,32 % 32 = 9,相当于没移位
0 -1 -1                  //变量负数:正数右移2位变为0; -2右移1位变为-1; -2右移超过1位仍是-1
0 -2147483648 0          //常量:1左移32位,超过上限为01左移31位到符号位,变为最小值; 1右移1位变为0
-1 -2147483648 0         //常量:-4右移4位超过上限只为-1; -1左移31位没超过上限为最小值; -1左移32位超过上限为0



总结:

【1】不管变量常量,正数右移都正常移位 [相同]

【2】常量正数左移都正常移位,变量正数左移超过为%32 [区别]

【3】常量负数右移超过为-1,变量负数右移超过也为-1 [相同]

【4】常量负数左移超过为0,变量负数左移超过为%32移位 [区别]



参考博客
http://blog.csdn.net/qq_31828515/article/details/53286554

2017.10.16

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值