【学习笔记】C语言中的移位操作
作者:互联网
在看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