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位,超过上限为0; 1左移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