我的一些注释看不懂的话,可以参看我上一篇blog(含基础知识) https://blog.csdn.net/xiaoyue_/article/details/115218001
#include<stdio.h>
int main()
{
// 左移右移运算符
// 正数
int m1=5;
// 5的补码: 0000 0000 0000 0000 0000 0000 0000 0101 (正数的原码、反码、补码都相同)
// 右移2位 >> 0000 0000 0000 0000 0000 0000 0000 0001 (补0) == 1
// 左移2位 << 0000 0000 0000 0000 0000 0000 0001 0100 (空出来的补0) == 20
printf("m1=5右移2位=%d\n",m1>>2);
printf("m1=5左移2位=%d\n",m1<<2);
// 负数
int m2=-7;
// -7的原码:1000 0000 0000 0000 0000 0000 0000 0111 (计算机都是用补码进行计算的)
// -7的反码:1111 1111 1111 1111 1111 1111 1111 1000
// -7的补码:1111 1111 1111 1111 1111 1111 1111 1001 (反码+1==补码)
//右移>>3位:1111 1111 1111 1111 1111 1111 1111 1111 (补码,需要转换为原码)
// 补码转为原码:
// 1111 1111 1111 1111 1111 1111 1111 1111 (补码,先当作原码算,最后再换回去)
// 1000 0000 0000 0000 0000 0000 0000 0000 (反码)
// 1000 0000 0000 0000 0000 0000 0000 0001 (反码+1==补码,换回去,即为原码==-1)
//左移<<3位:1111 1111 1111 1111 1111 1111 1100 1000
//补码转换为原码:
// 1111 1111 1111 1111 1111 1111 1100 1000 (同理)
// 1000 0000 0000 0000 0000 0000 0011 0111 (反码,符号位不变,按位取反)
// 1000 0000 0000 0000 0000 0000 0011 1000 (==-56)
// 验证
printf("m2=-7右移3位=%d\n",m2>>3);
printf("m2=-7左移3位=%d\n",m2<<3);
return 0;
}
输出如下: