C基础之移位操作
2024-09-05 06:56:21
因为左移操作不会导致符号位出现缺位,所以不考虑符号位,低位补0即可;右移操作会涉及到符号位出现缺位的问题,所以在有符号数的右移操作时要考虑符号位怎么补的问题。
左移操作(<<)对于无符号数和有符号数来讲,均为逻辑左移操作,对应汇编中的shl;
右移操作(>>)对于无符号数来讲为逻辑右移,对应汇编中的shr,对于有符号数来讲为算数右移,对应汇编中的sar。
对于VC编译器编出来的代码,移位操作的位数保存在cl寄存器。
当移动的位数大于或等于该数据类型位数时,CPU对移动的位数进行基于数据类型位数的取余运算,余数为实际移动的位数。比如uint32_t类型左移32位,实际移动0位,也就是数字保持不变;左移33位,则实际左移1位。
逻辑左移时,高位补0;逻辑右移时,低位补0。
算数右移时,最高的符号位在每移动一位时都会自动补为原来的值。举例来讲的话,比如int32_t类型的0x80000000,右移1位的话变成0xC0000000,右移31位变成0xFFFFFFFF,也就是说任何int32_t类型的负数在右移31位后都会变成0xFFFFFFFF(符号位的复制),任何int32_t类型的正数在右移31位后都会变成0(相当于逻辑右移)。
因为浮点数的特殊编码方式,浮点数的移位操作基本没啥意义。
在汇编层面,移位操作要比乘除法的操作效率高,不过对于现代编译器而言,已经具备了对于C中乘除法的指令级优化功能。
对于正整数,在不产生溢出的情况下,左移n(n>=1)位的效果为:×(2的(类型位数%n)次幂);右移n(n>=1)位的效果:÷(2的(类型位数%n)次幂),只保留结果的整数部分。
最新文章
- Python学习——基础篇
- SharePoint 2010 文档管理之过期归档工具
- iOS之UI--辉光动画
- (Struts)ActionForm类及表单数据验证
- v4l2
- 面向对象的static关键字(类中的static关键字)
- ExtJs之Ext.apply
- C盘清理大作战
- mac 浏览器 强刷快捷键
- LeetCode——Pascal&#39;s Triangle
- java中将list、map对象写入文件
- 解决 Windows instance 时间不同步问题 - 每天5分钟玩转 OpenStack(153)
- 安卓开发之mqtt协议
- Java爬虫——常用的maven依赖
- Mybatis--课程中循序渐进的体会 《黑马程序员_Springmvc+Mybatis由浅入深全套视频教程video》
- [洛谷P1638]逛画展
- [HDFS_add_3] HDFS 机架感知
- vue 基础(二)
- scikit-FEM-mesh
- poj1611 The Suspects(并查集)
热门文章
- J2EE 中 用 El表达式 和 Jsp 方式 取得 URL 中的参数方法
- Android之旅 自我图示总结四大组件
- 使用python读取word
- 解决Ubuntu Ping网关Destination Host Unreachable错误
- 在低带宽或不可靠的网络环境中安装 Visual Studio 2017
- 【php】Apache无法自己主动跳转却显示文件夹与php无法连接mysql数据库的解决方式
- ScriptableObject 对象化的运用
- spring4.3+mybatis3.4+freemark+log4j2+fastjson整合
- curl命令常用参数
- MVC与MVP(转)