左移运算符:

按位左移

形式:操作数 << 移动位数

规则:

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