栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言中关于移位操作注意事项

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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位来避免算术右移操作。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847976.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号