C 移位运算
发布日期:2021-06-29 19:23:46 浏览次数:3 分类:技术文章

本文共 1040 字,大约阅读时间需要 3 分钟。

移位运算分为左移(<<)与右移(>>),其中右移又分为逻辑右移与算术右移。三者实现如下:

(1)左移:移出去的位丢弃,空缺位(vacant bit)用 0 填充;
(2)逻辑右移:移出去的位丢弃,空缺位(vacant bit)用 0 填充;
(3)算术右位:移出去的位丢弃,空缺位(vacant bit)用符号位来填充。

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

左移:

在这里插入图片描述
逻辑右移:
在这里插入图片描述
算术右移:
在这里插入图片描述
移位算只能作用于整数,不能作用于浮点数。对于无符号整数与有符号整数,左移操作相同,但右移稍有区别。
(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.outa=0xffffffffa<<1=0xfffffffea>>2=0xffffffffb=0x00000001b<<1=0x00000002b>>1=0x00000000

参考文献

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

转载地址:https://dablelv.blog.csdn.net/article/details/93736619 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Golang 主机字节序的判断
下一篇:认识目标文件的符号

发表评论

最新留言

很好
[***.229.124.182]2024年04月23日 00时25分40秒