关于逻辑左移和算数左移以及逻辑右移和算数右移
2012-12-29 16:55
701 查看
今天在看csapp中关于移位操作的处理,上面说逻辑左移和算数左移是等同的,想了想,怎么可能,写了程序测试了一把,发现确实一样,但是这个是有前提条件的,在逻辑左移和算数左移的操作数中,如果左移没有产生有对符号位影响的进位,那么左移都一样,比如int(4字节),它表示的范围为范围[-2^31 , 2^31 -1] 即 [-2147483648,2147483647]。
如果一个数在[-1073741824,1073741823]范围之内,左移一位,不管是逻辑左移还是算数左移都不会对最高位的符号位产生影响,所以左移一样,但是左移两位的话,那么对于int将会产生溢出,此时逻辑左移和算数左移将不一样。算数左移将产生溢出,而逻辑左移不会有溢出这一概念。
如果一个数在[-1073741824,1073741823]范围之内,左移一位,不管是逻辑左移还是算数左移都不会对最高位的符号位产生影响,所以左移一样,但是左移两位的话,那么对于int将会产生溢出,此时逻辑左移和算数左移将不一样。算数左移将产生溢出,而逻辑左移不会有溢出这一概念。
算术左移和算术右移主要用来进行有符号数的倍增、减半; 逻辑左移和逻辑右移主要用来进行无符号数的倍增、减半。 记住这个就可以了。 算术左移和算术左移虽然方式是一样的,但他们表示的移位后数的范围是不一样的,有符号数左移(算术左移)位后的范围是-128——127【指8位】.而无符号数(算术左移)左移的范围是0——255.【指8位】 其实不管是哪种移位(上述的),均要考虑移位后的范围。我们这学期也学微机,刚好学到这,希望对你的理解有所帮助,
#include<stdio.h> int main() { int a=5,b=-5; a=a*2; b=b*2; printf("a=%d,b=%d\n",a,b); a=a<<1; b=b<<1; printf("a=%d,b=%d\n",a,b); a=a>>1; b=b>>1; printf("a=%d,b=%d\n",a,b); a=1073741823,b=-1073741824; a=a<<1; b=b<<1; printf("a=%d,b=%d\n",a,b); return 0; }
相关文章推荐
- 与江岭师弟的讨论 - 关于形式化逻辑的局限以及其它
- 关于短信的读取以及新短信到达时如何触发事件去处理自己的逻辑
- 逻辑和算数以及进制
- Oracle 中关于null值的概念以及逻辑运算
- 关于CheckBox全选以及反选还有单选,多选的逻辑实现
- 关于i++和++i以及&&的逻辑
- 关于逻辑移位和算数移位
- 关于LTE系统中的逻辑信道、传输信道以及物理信道
- MIPS 加载,算数以及逻辑运算
- 关于逻辑回归中的Enter以及stepwise的区别
- 关于Html中的title属性内容换行,以及Bootstrap的tooltip的使用
- 关于awstats的安装以及配置
- LINQ下使用三层架构的探索(六)逻辑访问层中的数据统计以及一个主从报表。
- maven在eclipse中配置过程并导入maven工程,以及关于工程中jdk和git的设置,
- 关于IE8以及以下版本不支持媒体查询的解决方案
- 关于scrollTop为0以及解决方法
- 关于scanf,printf以及c中字符串的一些总结
- 12 关于端点(Endpoint)、簇(clusterId)以及规范(ProfileID)
- 关于存储过程事务,返回值,变量声明以及执行方法
- 关于PDNN、Theano、Numpy以及Scipy的安装