31.2 整数とその計算

最初のプログラムで確認した通り,Java ではいろいろとプログラム言語特有の約束事を書く必要があるものの,計算部分は数式がそのまま使えます.そこでまずは数式を解説します.
はじめに Java は整数を認識することができ,その四則演算を行うことができます.足し算・引き算よりもかけ算・割り算の方を先に計算するや,括弧を使って順番を調整するといった規則も数学と同じです.
しかし,注意点があります.例えば,10 年の秒数と 100 年の秒数と 1000 年の秒数を計算させてみましょう.前回は 1 つの値しか計算しませんでしたが,“System.out.println(…);” という行を並べることで順番に計算と結果の表示をすることができます.

// Program.java: 整数 class Program { public static void main(String[] args) { System.out.println(60 * 60 * 24 * 365 * 10); System.out.println(60 * 60 * 24 * 365 * 100); System.out.println(60 * 60 * 24 * 365 * 1000); } }

このソースコードを変換・実行すると次の出力を得ます.
315360000 -1141367296 1471228928

10 年はよいですが,100 年は負の値になっていて,1000 年もおかしいです.
これは Java の(標準で使われる)整数は桁数に限りがあるため,それを超える計算結果の時は上の桁を省いてしまうため起こります.コンピュータは有限の情報しか扱えないので,大きな数を扱う際は注意が必要です(参考:hwb18.3.1 整数の符号化).

整数のまとめ

整数とその計算について詳しくまとめておきます.ただし,ソースコードのうち “Program” と “main” の部分を省略しています.

  • 小数点が付かない数値を書くと整数と見なされます.
    System.out.println(1);
    System.out.println(-17);
    

    1 -17
  • 先頭に “0”, “0x” を付けると,それぞれ 8, 16 進法の整数と見なされます.
    System.out.println(044);
    System.out.println(0xFF);
    

    36 255
  • 整数の加減乗除はそれぞれ +, -, *, / という記号を使います.ここで “+”, “-”, “*” は和,差,積が整数なので感覚通りに使えますが,割り算の “/” は整数の商が計算されるので注意が必要です.
    System.out.println(7 + 3);
    System.out.println(7 - 3);
    System.out.println(7 * 3);
    System.out.println(7 / 3);
    

    10 4 21 2
  • 小数まで計算してほしい時は小数として計算します(参考:hwb31.3 小数とその計算).
  • また,整数の割り算での余りを求めたい時は “%” と書きます.
    System.out.println(7 % 3);
    

    1
  • かけ算・割り算および余りの計算は足し算・引き算よりも先に行います.
    System.out.println(3 + 7 * 2);
    

    17
  • 丸括弧 “()” を使うと計算の順序を変えることができます.
    System.out.println((7 + 3) * 2);
    

    20
  • 括弧の中に括弧を入れることができますが,“{}”, ”[]” といった他の種類の括弧を使うことはできません.
    System.out.println(((7 + 3) * 2) / (5 - 2));
    
    6
    System.out.println({(7 + 3) * 2} / (5 - 2));
    

    Program.java:4: 式の開始が不正です. System.out.println({(7 + 3) * 2} / (5 - 2)); ^ // 中略 エラー 11 個
  • 扱える整数の範囲には限りがあって,231-1 から -231 までつまり 2,147,483,647 から -2,147,483,648 までです.
    System.out.println(3000000000);
    
    Program.java:4: 整数 3000000000 が大き過ぎます. System.out.println(3000000000); ^ エラー 1 個
    System.out.println(3000 * 1000 * 1000);
    

    -1294967296