From: Colin Bartlett Date: 2009-09-16T03:07:29+09:00 Subject: Re: Overflow behavior --001485f6c5c68051260473a1a787 Content-Type: text/plain; charset=ISO-8859-1 On Tue, Sep 15, 2009 at 2:08 AM, David Masover wrote: > irb(main):009:0> (2**62-1).class => Fixnum > irb(main):010:0> (2**62).class => Bignum > irb(main):012:0> ((-2)**62-1).class => Fixnum > irb(main):013:0> ((-2)**62).class => Bignum > Fixnum seems to be a signed 63-bit integer (62 bits plus the sign bit) on my 64-bit system. > I'm guessing that it's actually a 31-bit signed integer on a 32-bit system. * Fixnum/Bignum is implementation dependent? On a Win32 Vista PC (with IRB/JIRB output cleaned up & aligned by hand): * Ruby 1.8.6 IRB: n = if RUBY_PLATFORM.downcase == "java" then 63 else 30 end #=> 30 nn = 2 ** n - 1 ; "#{nn.class} #{nn}" #=> Fixnum 1073741823 nn = -nn ; "#{nn.class} #{nn}" #=> Fixnum -1073741823 nn = 2 ** n ; "#{nn.class} #{nn}" #=> Bignum 1073741824 nn = -nn ; "#{nn.class} #{nn}" #=> Fixnum -1073741824 nn = 2 ** n + 1 ; "#{nn.class} #{nn}" #=> Bignum 1073741825 nn = -nn ; "#{nn.class} #{nn}" #=> Bignum -1073741825 * JRuby 1.3.1 JIRB: n = if RUBY_PLATFORM.downcase == "java" then 63 else 30 end #=> 63 nn = 2 ** n - 1 ; "#{nn.class} #{nn}" #=> Fixnum 9223372036854775807 nn = -nn ; "#{nn.class} #{nn}" #=> Fixnum -9223372036854775807 nn = 2 ** n ; "#{nn.class} #{nn}" #=> Bignum 9223372036854775808 nn = -nn ; "#{nn.class} #{nn}" #=> Fixnum -9223372036854775808 nn = 2 ** n + 1 ; "#{nn.class} #{nn}" #=> Bignum 9223372036854775809 nn = -nn ; "#{nn.class} #{nn}" #=> Bignum -9223372036854775809 --001485f6c5c68051260473a1a787--