わたなべです.

TEI meiki <tei / harmony.co.jp> writes:

:ruby で、32bit整数のシフト計算をしようとしたら、こんなふう
:になってしまったのですが、これはなぜでしょう?

バグです.

:それから、リッファレンスマニュアルの Fixnum クラスの説明に
:
:>    マシンのポインタのサイズに収まる長さの固定長整数.ほと
:>    んどの マシンでは31ビット幅です.演算の結果がFixnumの 
:>    範囲を越えた時には自動的に Bignumに拡張されます.
:
:とあるのは、32bit幅の間違いでしょうか?

64 ビットマシンでも動くようになったから
  sizeof (INT) * 8 - 1 ビット幅
が正解かもしれない. 1 ビットは Fixnum かどうかのフラグに使わ
れてます. ruby.h や README.EXT.jp などを参照.

-- 
わたなべひろふみ

--- numeric.c.orig Fri Jan 16 21:35:46 1998 +++ numeric.c Tue Feb 3 10:00:18 1998 @@ -826,3 +826,3 @@ i = NUM2INT(y); - if (y < 32) { + if (i < sizeof (INT) * 8) { val = RSHIFT(FIX2INT(x), i);