左移运算符:
按位左移
形式:操作数 << 移动位数
规则:
1.将操作数先转换为二进制数(补码);
2.二进制数各位左移若干位(移动位数);
3.在低位补若干个0;
4.高位左移后溢出,舍弃不起作用;
例如:
7 << 2
7转换为二进制:0000 0111,每位向左移动两位变为:0001 1100,转换为十进制数为28.
代码:
#includeint main(){unsigned char a, b;a = 7;b = a << 2;printf("%d\n",b);}
左移运算符:
按位右移
形式:操作数 >> 移动位数
规则:
1.将操作数先转换为二进制数(补码);
2.二进制数各位右移若干位(移动位数);
3.移出的低位舍弃,并在高位进行补位;
注意:关于补位的问题
1.操作数若为无符号数,则在左边补若干个0;
2.操作数若为有符号正数,则在左边补若干个0;
3.操作数若为有符号负数,左边补1为算术右移,左边补0为逻辑右移;
例如:
1.无符号数:
7 >> 2
7转换为二进制:0000 0111,每位向右移动两位变为:0000 0001,转换为十进制数为1.
2.有符号正数:
7 >> 2
(同无符号)7转换为二进制:0000 0111,每位向右移动两位变为:0000 0001,转换为十进制数为1.
3.无符号数:
-7 >> 2
7转换为二进制补码:1111 1001,每位向右移动两位变为:1111 1110,转换为十进制数为-2.这里值得注意的一点,当-7右移位数超过3位时,结果都为1111 1111,转换为十进制一直都是-1;
代码:
#includeint main(){char a, b, c, d;a = -7;b = a >> 2;c = a >> 3;d = a >> 5;printf("%d\n%d\n%d\n", b, c, d);}
结果:
-2-1-1