软件开发工程师修炼中|
2022-04-10 13:49阅读: 927评论: 0推荐: 0

【学习笔记】C语言中的移位操作

在看CMU的深入理解计算机系统课程,打算对其中对于移位操作的讲解进行一个总结。
C语言中存在无符号数与有符号数的区别,但是在进行右移操作时,不管是有符号数还是无符号数都只使用>>,像Java中就不存在无符号数,如果想进行逻辑右移则使用>>>,算术右移则是>>。因此,需要弄清楚C语言当中的右移操作中逻辑右移和算术右移出现的场合,才不至于写出错误的代码。
左移很容易,向左移动多少位则丢弃左边相应的位数,并在右侧补0。
对于右移,由于最左侧的一位被用于当作符号位,因此右移有两种情况:

  1. 逻辑右移:不管符号位是什么,直接在左边补0
  2. 算术右移:在左边补上与符号位相同的数字

C语言实际上并没有明确定义对于有符号数应该使用哪种右移,但是几乎所有的编译器/机器都会对有符号数进行算术右移,而对于无符号数,必须是逻辑右移。
总结一下就是:在C语言中,左移操作均是在右侧补0;对于右移操作,有符号数一般是算术右移,无符号数则是逻辑右移。

在了解了C语言中的移位操作之后,需要面临的另一个问题就是,如果移位操作的位数大于等于数字实际的位数会发生什么情况。
C语言的标准中并没有说明这种情况,但是在大多数机器上,如果要移动k位,k>=w(数字的最大位数),实际上的位移量是k mod w。但是这种行为对于C语言来说是无法保证的,因此尽量不要进行这种移位操作数大于数字位数的行为,但是像在Java中,这种位移数的要求是可以得到保证的。

最后是关于C语言中,移位运算符的优先级问题,移位运算符的优先级是低于+/-符号的,比如对于1 >> 2+3 >> 4,实际上的运算顺序是1 >> (2 + 3) >> 4。对于只有移位运算符的式子,则是从左至右结合。

本文作者:无涯清酒

本文链接:https://www.cnblogs.com/wuyawine/p/16125601.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   无涯清酒  阅读(927)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起