-O0 で、以下のようにすると SEGV になります。

% ./ruby -ve '1 << -0x40000000'
ruby 1.9.0 (2007-07-18 patchlevel 0) [i686-linux]
zsh: segmentation fault  ./ruby -ve '1 << -0x40000000'

ここで、左オペランドをひとつ減らすと、左マイナスたくさんシフ
トなので、結果は 0 になるはずだとおもうのですが、表示するに
は大きすぎる値になります。

% ./ruby -e 'p((1 << -0x40000001).size)' 
134217728

ずっと減らして以下なら、やはり 0 になるはずだとおもいますが、
1 になります。

% ./ruby -e 'p 1 << -0x80000000'      
1

さらにもうひとつ減らすと、やはり 0 になってほしいのですが、
RangeError になります。

% ./ruby -e 'p 1 << -0x80000001'
-e:1:in `<<': bignum too big to convert into `long' (RangeError)
        from -e:1:in `<main>'

また、以下は SEGV になります。

% ./ruby -e '1 >> -0x40000000'         
zsh: segmentation fault  ./ruby -e '1 >> -0x40000000'

ここで左オペランドをひとつ減らすと、右マイナスたくさんシフト
なのでとても大きな値になると思うのですが、0 になります。

% ./ruby -e 'p 1 >> -0x40000001'  
0

ずっと減らして以下なら、やはりとても大きな値になると思うので
すが、1 になります。

% ./ruby -e 'p 1 >> -0x80000000'
1

また、こんどは右オペランドを正にして以下を試すと、0 になって
ほしいのですが RangeError になります。

% ./ruby -e 'p 1 >> 0x80000000'
-e:1:in `>>': bignum too big to convert into `long'
         >>(RangeError)
        from -e:1:in `<main>'
-- 
[田中 哲][たなか あきら][Tanaka Akira]