#include<stdio.h>
int main()
{
//左移操作符
int a = 5; //补码00000000 00000000 00000000 00000101 原码值为5
int b = a << 1; //补码00000000 00000000 00000000 00001010 原码值为10
printf("%d\n", a);//位操作符后,a的值不变 相当于 *2
printf("%d\n", b);
printf("\n");
int c = -5; //补码11111111 11111111 11111111 11111011 原码值为-5
int d = c << 1; //补码11111111 11111111 11111111 11110110 原码值为-10
// 相当于 *2
//此时检测符号位是否为1,为1怎按负数补码处理,为0则直接输出
//反码11111111 11111111 11111111 11110101
//原码10000000 00000000 00000000 00001010
printf("%d\n", c);//打印出来的是原码
printf("%d\n", d);
printf("\n");
int e = -2147483647; // 原码值为-2147483647
//11111111 11111111 11111111 11111111原码
//10000000 00000000 00000000 00000000反码
//10000000 00000000 00000000 00000001补码
int f = e << 1; // 原码值为2
printf("%d\n", e);//10000000 00000000 00000000 00000001补码
printf("%d\n", f);//0000000 00000000 00000000 000000010补码
printf("\n");
//左边丢弃,右边补零(丢了符号位)
//-2147483647
//11111111 11111111 11111111 11111111原码
//10000000 00000000 00000000 00000000反码
//10000000 00000000 00000000 00000001补码
//右移操作符
int g = -5; //11111111 11111111 11111111 11111011补码
int h = g >> 1; //11111111 11111111 11111111 11111101补码
//10000000 00000000 00000000 00000011原码
//此编译器为
//算数右移:符号位补原来的符号位
//如若为逻辑右移:
//符号位补零
printf("%d\n", g);
printf("%d\n", f);
return 0;
}