Arithmetic shift とは

コンピュータプログラミングでは、算術シフトはシフト演算子であり、符号付きシフトとも呼ばれます(ただし、符号付きのオペランドに限定されません)。 2つの基本的なタイプは算術左シフトと算術右シフトです。 2進数の場合、それはそのオペランドのすべてのビットをシフトするビット演算です。オペランドの各ビットは、所定の数のビット位置に単純に移動され、空のビット位置が埋められます。論理シフトの場合のように、すべての0で満たされる代わりに、右にシフトするとき、符号付き整数表現の符号ビット)がすべての空き位置を埋めるように複製されます(これは符号拡張の一種です)。
いくつかの著者は、それぞれ、算術および論理シフトに対して固定右シフトおよびゼロ充填右シフトという用語を好む。
算術シフトは、2の累乗で符号付き整数の乗算または除算を実行する効率的な方法として役立ちます。符号付きまたは符号なしの2進数にnビットだけシフトすると、2n倍になります。 2の補数の符号付き2進数の右にnビットシフトすると、2nで除算する効果がありますが、常に負の無限大に向かって切り捨てられます。これは丸めが通常符号付き整数除算(0に丸める)で行われる方法とは異なります。この不一致により、複数のコンパイラでバグが発生しています。
たとえば、x86命令セットでは、SAR命令(算術右シフト)は符号付き数値を2の累乗で除算し、負の無限大に向かって丸めます。ただし、IDIV命令(符号付き除算)は符号付きの数値を0に丸めます。したがって、SAR命令は2命令の累乗でIDIVを代入することも、その逆もできません。