« Archives on 2011/01/19

Rubyにおけるintの最大値とは。エラー処理は?

ふと気になって、いじってみる。

元のソースはトラックバック先のものとほぼ変わらず。

#! ruby -Ks
puts 'Input Number'
int = gets.chomp
puts 'Input Number is ' + int.to_s
puts 'Next Number ' + (int.to_i + 1).to_s

このプログラムを実行すると、入力待ち画面になるので以下のような数字を入力してみる

  • 2147483647
  • -2147483648
  • A
  • 1000000000000000000000
  • 結果は以下のようになる。

  • 2147483648
  • -2147483647
  • 1
  • 1000000000000000000001
  • あれ、なんでオーバーフローしねえの(汗
    おっかしいなあと思って逆引きRubyを読んでみる。

    RubyではFixnumクラスとBignumクラスで整数値を、Floatクラスで浮動小数点を扱うことができます。またMathモジュールでは三角関数や対数などを計算する関数が提供されます。 Fixnumは31ビットまたは63ビットの固定長整数を扱うクラスですが、演算結果をこの範囲を超える場合、自動的にBignumに拡張されます。Bignumは無限多倍長整数でメモリの許す限りの大きな値を扱うことができます。

    引用元:逆引きRuby -数値

    なんと、Rubyではこのような場合にはオーバーフローは起きずにそのままBignumに拡張されるのだ。
    これは逆に気づかない奴続出で、他言語触ったりちょっとしたことでエラー多発させるやつが続出するんじゃなかろうかw

    しかし、ちょっとした悪戯心から面白いRubyの特性を垣間見た気がするw