あなたの実装は、おそらく 2 の補数で算術ビット シフトを行っているようです。このシステムでは、すべてのビットを右にシフトしてから、最後のビットのコピーで上位ビットを埋めます。したがって、あなたの例では、ここで int を 32 ビットとして扱います。
nPosVal = 00000000000000001111111111111111
nNegVal = 11111111111111110000000000000001
シフト後、次のものが得られます。
nPosVal = 00000000000000000111111111111111
nNegVal = 11111111111111111000000000000000
これを 10 進数に戻すと、それぞれ 32767 と -32768 になります。
事実上、右シフトは負の無限大に向かって丸められます。
編集:最新のドラフト標準 のセクション 6.5.7 によると、負の数に対するこの動作は実装に依存します。
E1 >> E2 の結果は、E1 を右シフトした E2 ビット位置です。E1 が unsigned 型の場合、または E1 が signed 型で負でない値の場合、結果の値は E1 / 2 E2の商の整数部分になります。E1 に符号付きの型と負の値がある場合、結果の値は実装定義です。
彼らはこれについて次のように述べています。
C89 委員会は、K&R によって付与された実装の自由を確認し、符号付き右シフト操作を符号拡張する必要はありません。そのような要件は高速なコードを遅くする可能性があり、符号拡張シフトの有用性はわずかであるためです。(負の 2 の補数の整数を算術的に右に 1 桁シフトすることは、2 で割ることと同じではありません!)
したがって、理論的には実装に依存します。実際には、左のオペランドが符号付きの場合に算術右シフトを行わない実装を見たことがありません。