C 语言的移位运算
参考博客:http://blog.csdn.net/e3399/article/details/7526230
如有错误,欢迎指正!
结论:左移是逻辑移位,右移是算术移位; 也就是说:左移补齐0,右移补齐符号位。
- 推论1:正数左移可能为负数;正数右移一定为非负数
- 推论2:负数左移可能为正数;负数右移一定为负数
- 推论3:在不改变符号位的情况下,左移相当于乘以2,右移相当于除以2(整数运算)
验证都是比较简单,读者可以自己进行更多数据的验证
验证推论1:正数左移可能为负数;正数右移一定为非负数
int main(int argc, char *argv[]) {
//验证 推论1
int i = 0x40000001;
int j = i << 1;
printf("i = %d, hex = %x\n", i, i);
printf("j = %d, hex = %x\n", j, j);
i = 0x03;
j = i >> 1;
printf("i = %d, hex = %x\n", i, i);
printf("j = %d, hex = %x\n", j, j);
return 0;
};
输出:
i = 1073741825, hex = 40000001
j = -2147483646, hex = 80000002
i = 3, hex = 3
j = 1, hex = 1
分析:
i = 1073741825 大于 0,左移 1 位得 j = -2147483646 小于0;验证正数左移可能为负数。
i = 3 大于 0,右移 1 位得 j = 1 大于0;验证正数右移一定为非负数(可能为零)。
验证推论2:负数左移可能为正数;负数右移一定为负数
int main(int argc, char *argv[]) {
//验证 推论2
int i = 0x80000001;
int j = i << 1;
printf("i = %d, hex = %x\n", i, i);
printf("j = %d, hex = %x\n", j, j);
j = i >> 1;
printf("i = %d, hex = %x\n", i, i);
printf("j = %d, hex = %x\n", j, j);
return 0;
};
输出:
i = -2147483647, hex = 80000001
j = 2, hex = 2
i = -2147483647, hex = 80000001
j = -1073741824, hex = c0000000
分析:
i = -2147483647 左移 1 位得 j = 2;验证:负数左移可能为正数;
i = -2147483647 右移 1 位得 j = -1073741824;验证:负数右移一定为负数
验证推论3:在不改变符号位的情况下,左移相当于乘以2,右移相当于除以2(整数运算)
情况1:当 i 是正数的情况下
int main(int argc, char *argv[]) {
//验证 推论3 当 i 是正数的情况
int i = 0x20000001;
printf("i = %d, hex = %x\n", i, i);
int j = i << 1; //左移 1 位
printf("j = %d, hex = %x\n", j, j);
j = i >> 1; // 右移 1 位
printf("j = %d, hex = %x\n", j, j);
j = i << 2; // 左移而且改变了符号位
printf("j = %d, hex = %x\n", j, j);
};
输出:
i = 536870913, hex = 20000001
j = 1073741826, hex = 40000002
j = 268435456, hex = 10000000
j = -2147483644, hex = 80000004
可以看出,左移 1 位 相当于乘以 2,右移 1 位相当于除以 2;当时一旦改变了符号位,就不成立了。
情况2:当 i 是负数的情况下
int main(int argc, char *argv[]) {
//验证 推论3 当 i 是正数的情况
int i = 0xdffffffb;
printf("i = %d, hex = %x\n", i, i);
int j = i << 1; //左移 1 位
printf("j = %d, hex = %x\n", j, j);
j = i >> 1; // 右移 1 位
printf("j = %d, hex = %x\n", j, j);
j = i << 2; // 左移 2 位, 该表了符号位
printf("j = %d, hex = %x\n", j, j);
};
输出:
i = -536870917, hex = dffffffb
j = -1073741834, hex = bffffff6
j = -268435459, hex = effffffd
j = 2147483628, hex = 7fffffec
可以看出,左移 1 位 相当于乘以 2,右移 1 位相当于除以 2;当时一旦改变了符号位,就不成立了。