C语言基础之左移

    左移  <<

i << j;

    ◆ i中所有的位向左移动j个位置,而右边填入0

    ◆ 所有小于int的类型,移位以int的方式来做,结果是int

x <<= 1;
//等价于
x *= 2;
x <<= n;
//等价于
for(int i = 0; i < n; i++)
{
    x *= 2;
}

    右移  >>

i >> j;

    ◆ i中所有的位向右移j位

    ◆ 所有小于int的类型,移位以int的方式来做,结果是int

    ◆ 对于unsigned的类型,左边填入0

    ◆ 对于signed的类型,左边填入原来的最高位(保持符号不变)

x >>= 1;
//等价于
x /= 2;
x >>= n;
//等价于
for(int i = 0; i < n; i++)
{
    x /= 2;
}

      【例】分别做两个signed和unsigned类型的变量

#include<stdio.h>

int main(int argc, const char* argv[])
{
    int a = 0x80000000;
    unsigned int b = 0x80000000;
    printf("a = %d\n", a);
    printf("a = %u\n", b);
    printf("a >>= %d\n", a >> 1);
    printf("b >>= %d\n", b >> 1);
    return 0;
}

    我们可以看到,运行的结果中a和b分别做右移运算后其值并没有发生正负号的改变:

    这就说明,如果要移位操作的数是正数,其右侧填充的是0;而如果要移位操作的数是负数,其右侧填充的是1;这样做就可以保证其移位运算的符号不发生改变。这一点特别要与左移运算区分,左移运算中不管变量的正负,右侧直接填充0!

    移位未定义的行为

    ◆ 移位的位数不要用负数,这是没有定义的行为

x << -2;        //NO!

 


版权声明:本文为lilejin322原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。