概述
更新于20200715:
逻辑移位和算术移位不同,否则汇编指令就保留一个就行了,干嘛还保留2个呢?
因此:
逻辑移位主要用于无符号数的移位,左移和右移均是移丢一位+空位补0
算术移位主要用于有符号数的移位运算,移位操作时,无论是正数还是负数,无论是原码,反码,补码,均不能改变符号位的位置和值
算术移位分正数的原码,反码,补码的左移和右移,负数的原码,反码,补码的左移和右移
其中正数的原码,反码,补码完全一样,所以左移和右移时,符号位不变,数值的最高位或最低位移丢,空出的位补0;
负数的原码,左移:符号位不变,数值最高位移丢,最低位补0;右移:符号位不变,数值最低位移丢,最高位补0,
负数的反码,左移:符号位不变,数值最高位移丢,最低位补1;右移:符号位不变,数值最低位移丢,最高位补1,
负数的补码,左移:符号位不变,数值最高位移丢,最低位补0;右移:符号位不变,数值最低位移丢,最高位补1。
第一种观点:
逻辑左移=算术左移,右边统一填0 ,最高位移入cf
逻辑右移,左边统一添0 ,最低位移入cf
特殊:算数右移,左边添加的数和符号位有关,最低位移入cf
e.g:1010101010,其中[]是添加的位
逻辑左移一位:010101010[0]
算数左移一位:010101010[0]
逻辑右移一位:[0]101010101
算数右移一位:[1]101010101
算术右移的2种实现方式(结果是相同的):
1.符号位不变,数值位右移,最低位移入cf,最高位数值位填符号位的值(1或0);
2.符号位和数值位无差别右移,最低位移入cf,最高位填符号位的值(1或0)。
第二种观点:
算术移位时符号位(最高位)不变:
左移时最高数值位移进cf,最低位填0;
右移时最低数值位移进cf,最高数值位填符号位的值(1或0);
逻辑移位时没有符号位:
左移时最高位移进cf,最低位填0;
右移时最低位移进cf,最高位填0;
例如:
10101110逻辑右移一位得01010111逻辑左移一位得01011100。
若将其视为补码则算术左移一位得11011100算术右移一位得11010111。
可见两种移位结果不同。
以上属于转载别人观点,个人暂更倾向于第二种观点
最后
以上就是魁梧大侠为你收集整理的逻辑左移、逻辑右移、算术左移、算术右移区别的全部内容,希望文章能够帮你解决逻辑左移、逻辑右移、算术左移、算术右移区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复