算术移位和逻辑移位


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

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


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

  • 有符号数:

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

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


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

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

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

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

你可能感兴趣的:(C/C++)