C语言中关于移位操作注意事项
序言
C语言尤其是嵌入式开发过程中总是容易遇到对于整型数进行乘除操作的情况,众所周知,在计算机二元世界中,移位操作作为算术移位执行速度相较于乘除数学符号运算较快,尽管两种方式最后的结果是一致的。
正文
此处有个需要特别注意的地方:
在移位操作中,若进行左移操作,则不关乎被移位操作对象是否为负数。
在移位操作中,若进行右移操作,若直接右移操作,则产生的结果有可能与直接除法运算结果不匹配。
**对于负数算术右移操作计算原理步骤具体为:
1、对负数绝对值数值进行二进制表示。
2、在二进制表示后最高位添加1来表示负号
3、将新组合二进制数符号位保持不变,原码转换为反码+1(负数在内存中是以补码形式存在)得到补码
4、对此补码进行右移操作,右移N位,则左边高位补N个1
5、对新得到的二进制表示转换为反码
6、对反码进行+1 **
例:-5>>2
(1)-5的绝对值为5,二进制表示为101
(2)对高位补1,表示负号,则二进制表示为1101
(3)符号位保持不变,其余取反码得1010
(4)对反码+1得补码为1011
(5)算术右移两位得1110(右移两位,左边补2个1)
(6)进行反码得1001
(7)对反码+1得补码为1010
(8)即结果为-2
此事例并未出现除法与算术右移结果不匹配的情况,但实际应用中当负数数字较大时是有可能出现的,此种情况可通过字操作来避免:
如:
typedef union word
{
struct
{
int16 HWord;
uint16 LWord;
}half;
}WORD;
将所求数值左移16位,然后取高16位来避免算术右移操作。
C语言中关于移位操作注意事项相关推荐
- java 定义一组常量用什么最好_Java语言中定义常量注意事项解析
一.常量定义的基本注意事项. 在Java语言中,主要是利用final关键字(在Java类中灵活使用Static关键字)来定义常量.当常量被设定后,一般情况下就不允许再进行更改.如可以利用如下的形式来定 ...
- C语言中的移位运算乘法,C语言中 移位操作运算
移位规律: 左移时总是移位和补零.右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位后补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移.(其实跟扩展逻辑一样 ...
- c语言中的位移位操作
先要了解一下C语言里所有的位运算都是指二进制数的位运算.即使输入的是十进制的数,在内存中也是存储为二进制形式. "<<"用法: 格式是:a<<m,a和m必须 ...
- C语言中的左移与右移[转]
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如: int i = 1; i = i << 2; //把i里的值左移2位 也就是说,1的2进制是00 ...
- C语言中的左移与右移
原文地址http://www.cnblogs.com/myblesh/articles/2431806.html 先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例 ...
- c++ ofstream 文件不存在_使用C语言中的头文件有什么技巧和注意事项吗?为什么不直接包含C文件呢?...
从事嵌入式开发多年,对于C语言使用的频率比较多,现在讲讲C语言在平时编程工作中经常出现的一些问题,就以楼主的题目为切入点分析归纳下,分享给正在使用或者学习C语言的小伙伴 C语言头文件有什么用处 在平时 ...
- c语言中的自己写的.h文件如何调用注意事项
c语言中的自己写的.h文件如何调用注意事项 需要建立一个项目project,并把相关的.h .c .cpp文件建在这个项目下面. 需要注意引用时不同,例如 #include<stdio.h> ...
- C语言中头文件和源文件的注意事项
C语言中头文件和源文件的注意事项 文章目录 C语言中头文件和源文件的注意事项 0.前言 1.实现步骤 1.1 拆分前 1.2 拆分后 2.总结 2.1头文件内容 2.2 源文件(.c)内容 2.3 函 ...
- c语言中字符型常量在内存中存放的是,【2017年整理】c语言中字符型常量与变量使用注意事项.doc...
[2017年整理]c语言中字符型常量与变量使用注意事项 字符型常量与变量 (1):字符常量:一个字符常量代表ASCII字符集中的一个字符,在程序中用单引号把一个字符括起来作为字符常量.例如'A' 'b ...
最新文章
- 遗传算法中的选择操作
- python里的tplt什么意思 Python的format格式化输出
- seaborn使用violinplot函数可视化水平小提琴图(Make Horizontal Violin Plot with violinplot in Seaborn)
- mfc将文件内容引入编辑框_南开大学黄津辉教授团队联合加拿大麦克马斯特大学Ravi教授团队发表微型MFC水质传感器实际废水检测适用性的研究...
- 融入产业生态的靶向孵化
- python实现二叉堆中的大顶堆(大根堆)
- boost::mp11::mp_map_find相关用法的测试程序
- 【Android】Intent介绍及Intent在Activity中的使用方法
- python数据类型特点_Python 基础数据类型
- LinQ—高级查询方法
- python3 collections模块 tree_第30天: Python collections 模块
- maven项目导出为jar包
- PHP中字符串类型与数值类型混合计算
- 212.单词搜索II
- 关于阿狸狗破戒大师自动安装完cadence17.4后licence不可用问题
- Word排版的正确姿势!(Word论文排版教学)
- NeHe OpenGL教程 第十三课:图像字体
- C语言解题——从今天开始入坑C语言
- 【献血小常识】------- 献血者健康检查标准
- python生存曲线_生存曲线的估计方法(3):寿命表法
热门文章
- Python设置属性值方法setattr()和判断变量是否存在的方法
- 快手CEO宿华:短视频更能刺激购买欲望 5G时代给我们机会
- 5000元性价比高的笔记本_求推荐5000元以下的高性价比笔记本电脑?
- MT5 EA交易期货-EA编程接口
- Redis实现分布式锁机制的原理
- 8_进程替换execlp
- 面对惠普将放弃PC业务,谈戴尔对其Latitude的信心
- 2022中国电子学会青少年软件编程C语言一级测试题
- 蓝牙接收苹果手机通知 ANCS协议分析
- iPhone7(P)广色域显示P3 导致设置RGB值 转sRGB 色值偏差问题 #3C76FF