Subjectはブロークンですが、
Array.pack('I')または('i')で、1.8.1ではMSBが立っていると例外になります。

D:\home\arton\ruby-1.8.1>ruby -v -e "p [0x80000000].pack('I')"
ruby 1.8.0 (2003-08-04) [i386-mswin32]
"\000\000\000\200"

D:\home\arton\ruby-1.8.1>ruby -v -e "p [0x80000000].pack('I')"
ruby 1.8.1 (2003-12-25) [i386-mswin32]
-e:1:in `pack': bignum too big to convert into `int' (RangeError)
        from -e:1

D:\home\arton\ruby-1.8.1>ruby -v -e "p [0x80000000].pack('L')"
ruby 1.8.1 (2003-12-25) [i386-mswin32]
"\000\000\000\200"

http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=pack%A5%C6%A
5%F3%A5%D7%A5%EC%A1%BC%A5%C8%CA%B8%BB%FA%CE%F3
を見ると32ビット値はLまたはlを使用しろという意図にも取れるので1.8.1から
はこうなったというだけなのかも知れませんが、できればこれまでの動作のほう
が嬉しいです。

D:\home\arton\ruby-1.8.1>diff -u -p pack.c.org pack.c
diff: conflicting specifications of output style
*** pack.c.org  Fri Dec 26 00:19:48 2003
--- pack.c      Fri Dec 26 00:20:04 2003
*************** pack_pack(ary, fmt)
*** 726,732 ****
                from = NEXTFROM;
                if (NIL_P(from)) i = 0;
                else {
!                   i = NATINT_I32(from);
                }
                rb_str_buf_cat(res, OFF32(&i), NATINT_LEN(int,4));
            }
--- 726,732 ----
                from = NEXTFROM;
                if (NIL_P(from)) i = 0;
                else {
!                   i = NATINT_U32(from);
                }
                rb_str_buf_cat(res, OFF32(&i), NATINT_LEN(int,4));
            }

-- 
arton <artonx / yahoo.co.jp>

__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!
http://bb.yahoo.co.jp/