-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]