在看CMU的深入理解计算机系统课程,打算对其中对于移位操作的讲解进行一个总结。
C语言中存在无符号数与有符号数的区别,但是在进行右移操作时,不管是有符号数还是无符号数都只使用>>,像Java中就不存在无符号数,如果想进行逻辑右移则使用>>>,算术右移则是>>。因此,需要弄清楚C语言当中的右移操作中逻辑右移和算术右移出现的场合,才不至于写出错误的代码。
左移很容易,向左移动多少位则丢弃左边相应的位数,并在右侧补0。
对于右移,由于最左侧的一位被用于当作符号位,因此右移有两种情况:
- 逻辑右移:不管符号位是什么,直接在左边补0
- 算术右移:在左边补上与符号位相同的数字
C语言实际上并没有明确定义对于有符号数应该使用哪种右移,但是几乎所有的编译器/机器都会对有符号数进行算术右移,而对于无符号数,必须是逻辑右移。
总结一下就是:在C语言中,左移操作均是在右侧补0;对于右移操作,有符号数一般是算术右移,无符号数则是逻辑右移。
在了解了C语言中的移位操作之后,需要面临的另一个问题就是,如果移位操作的位数大于等于数字实际的位数会发生什么情况。
C语言的标准中并没有说明这种情况,但是在大多数机器上,如果要移动k位,k>=w(数字的最大位数),实际上的位移量是k mod w。但是这种行为对于C语言来说是无法保证的,因此尽量不要进行这种移位操作数大于数字位数的行为,但是像在Java中,这种位移数的要求是可以得到保证的。
最后是关于C语言中,移位运算符的优先级问题,移位运算符的优先级是低于+/-符号的,比如对于1 >> 2+3 >> 4,实际上的运算顺序是1 >> (2 + 3) >> 4。对于只有移位运算符的式子,则是从左至右结合。
标签:右移,符号,笔记,C语言,位数,操作,移位 来源: https://www.cnblogs.com/wuyawine/p/16125601.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。