32.2 整数とその計算

最初のプログラムで確認した通り,OCamlでは数式がそのままプログラムになり,入力するとその値を計算してくれます.正確には整数を使う限りにおいてはほぼ同じです.足し算・引き算よりもかけ算・割り算の方を先に計算するや,括弧を使って順番を調整することができます.
しかし,注意点があります.例えば,10年の秒数と100年の秒数と1000年の秒数を計算させてみましょう.どのような式を入力すればよいかは,もう分かりますね?

60*60*24*365*10;;return2
- : int = 315360000
60*60*24*365*100;;return2
- : int = 3153600000
60*60*24*365*1000;;return2
- : int = 31536000000

現在のECCSではこのように正確に計算できますが,他の環境,例えば自宅のPCで同じことをさせると次のようになるかもしれません.
60*60*24*365*10;;return2
- : int = 315360000
60*60*24*365*100;;return2
- : int = 1006116352
60*60*24*365*1000;;return2
- : int = -676254720

10年はよいですが,100年,1000年とだんだん変な値になっています.
これはOCamlの(標準で使われる)整数は桁数に限りがあるため,それを超える計算結果の時は上の桁を省いてしまうため起こります.ECCSのOCamlでも範囲に限りがあることにかわりはないので,大きな数を扱う際は注意が必要です(参考:hwb18.3.1 整数の符号化).

整数のまとめ

整数とその計算について詳しくまとめておきます.

  • 小数点が付かない数値を書くと整数と見なされます.
    1;;return2
    - : int = 1
    -17;;return2
    - : int = -17
  • 先頭に“0b”, “0o”, “0x”を付けると,それぞれ2, 8, 16進法の整数と見なされます.
    0b01001;;return2
    - : int = 9
    0o44;;return2
    - : int = 36
    0xFF;;return2
    - : int = 255
  • 整数の加減乗除はそれぞれ+, -, *, /という記号を使います.ここで“+”, “-”, “*”は和,差,積が整数なので感覚通りに使えますが,割り算の“/”は整数の商が計算されるので注意が必要です.
    7 + 3;;return2
    - : int = 10
    7 - 3;;return2
    - : int = 4
    7 * 3;;return2
    - : int = 21
    7 / 3;;return2
    - : int = 2
  • 小数まで計算してほしい時は小数として計算します(参考:hwb32.3 小数とその計算).
  • また,整数の割り算での余りを求めたい時は“mod”と書きます.
    7 mod 3;;return2
    - : int = 1
  • かけ算・割り算および余りの計算は足し算・引き算よりも先に行います.
    3 + 7 * 2;;return2
    - : int = 17
  • 丸括弧“()”を使うと計算の順序を変えることができます.
    (7 + 3) * 2;;return2
    - : int = 20
  • 括弧の中に括弧を入れることができますが,“{}”, ”[]”といった他の種類の括弧を使うことはできません.
    ((7 + 3) * 2) / (5 - 2);;return2
    - : int = 6
    {(7 + 3) * 2} / (5 - 2);;return2
    Error: Syntax error
  • 扱える整数の範囲には限りがあって,230-1から-230までつまり1,073,741,823から-1,073,741,824まで,または262-1から-262までつまり4,611,686,018,427,387,903から-4,611,686,018,427,387,904までです.
    5000000000000000000;;return2
    Error: Integer literal exceeds the range of representable integers of type int
    5000 * 1000 * 1000 * 1000 * 1000 * 1000;;return2
    - : int = -4223372036854775808