C 移位运算

移位运算分为左移(<<)与右移(>>),其中右移又分为逻辑右移与算术右移。三者实现如下:
(1)左移:移出去的位丢弃,空缺位(vacant bit)用 0 填充;
(2)逻辑右移:移出去的位丢弃,空缺位(vacant bit)用 0 填充;
(3)算术右位:移出去的位丢弃,空缺位(vacant bit)用符号位来填充。

以补码 0x10110011 来演示左移、逻辑右移与算术右移。

左移:
C 移位运算_第1张图片
逻辑右移:
C 移位运算_第2张图片
算术右移:
C 移位运算_第3张图片
移位算只能作用于整数,不能作用于浮点数。对于无符号整数与有符号整数,左移操作相同,但右移稍有区别。
(1)对于无符号整数为逻辑右移;
(2)对于有符号整数为算术右移。

注意, 对于无符号整数,右移必须是逻辑右移。而对于有符号整数,C 语言标准并没有明确定义应该使用哪种类型的右移,但几乎所有的编译器均采用算术右移。

参考如下示例:

//
//@file: main.c
//

#include 
#include 

int main()
{
        int a = -1;    
        printf("a=0x%x\n", a);          //a=0xffffffff          
        printf("a<<1=0x%x\n", a<<1);    //左移,结果为 0xfffffffe
        printf("a>>2=0x%x\n", a>>2);    //算术右移,结果为 0xffffffff
    
        unsigned int b=1;
        printf("b=0x%08x\n", b);        //b=0x00000001
        printf("b<<1=0x%08x\n", b<<1);  //左移,结果为 0x00000002
        printf("b>>1=0x%08x\n", b>>1);  //逻辑右移,结果为 0x00000000
}

编译输出结果:

gcc main.c
./a.out

a=0xffffffff
a<<1=0xfffffffe
a>>2=0xffffffff
b=0x00000001
b<<1=0x00000002
b>>1=0x00000000

参考文献

[1] 龚奕利,贺莲译.深入理解计算机系统[M].北京:机械工业出版社,2016-11.C2.1.9 C语言中的移位运算.P40-41

你可能感兴趣的:(C)