首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C 移位运算

C 移位运算

作者头像
恋喵大鲤鱼
发布2019-07-01 17:58:24
1.9K0
发布2019-07-01 17:58:24
举报
文章被收录于专栏:C/C++基础C/C++基础

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

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

左移:

在这里插入图片描述
在这里插入图片描述

逻辑右移:

在这里插入图片描述
在这里插入图片描述

算术右移:

在这里插入图片描述
在这里插入图片描述

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

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

参考如下示例:

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

#include <stdio.h>
#include <stdint.h>

int main()
{
        int a = -1;    
        printf("a=0x%x\n", a);          //a=0xffffffff          
        printf("a<<1=0x%x\n", a<<1);    //左移,结果为 0xfffffffe
        printf("a>>1=0x%x\n", a>>1);    //算术右移,结果为 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>>1=0xffffffff
b=0x00000001
b<<1=0x00000002
b>>1=0x00000000

参考文献

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年06月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考文献
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档