操作
有符号整型数算术右移时,(浮点数没有移位操作)
- 所有位向右移动,丢弃移出的低位部分;
- 最高位 补原符号位 。
这样,可以保证每右移一次,移动后的数为原数的二分之一向下取整。
原理
※ 若对补码表示法不熟悉,参见有符号整数的补码表示法。
设
算术右移一位,设移位后的数值为
把
而
其中
对比
故
- 当
时, 为偶数,则 为整数,故 为整数,且 ; - 当
时, 为奇数,则 形如 ,而 ,故 为整数,且 。
综上所述,有
为“向下取整”符号。
注意事项
这里容易和 C 语言的整数除法混淆(参见取模与整除的计算方法)。C 语言里 -3 / 2 的结果是 -1,因为它采用向零截断,把 -3 >> 1 的结果是 -2,采用向下取整。两者在运算符前的数为负数且不能整除时不同。