Java | 整数リテラルの基本

Java Java
スポンサーリンク

初心者向けに噛み砕いて、例題(実行できるJavaコード)と解説を交えて詳しく説明します。読みやすく段階を追って進めます。

「整数リテラル」とは、プログラムの中で「そのまま書かれた数」のことです。
例:1230b10100xFF など。値そのものをソースコードに書いたものです。

1. 書き方(代表パターン)

  • 10進数(普通)
    そのまま書く。例:123, 0, -45(負の数はリテラル自体は 45- は単項演算子)。 int a = 123;
  • 2進数(binary)(Java 7 以降)
    0b または 0B を先頭につける。
    例:0b111111010(これ = 506)。 int b = 0b111111010; // 506
  • 8進数(octal)
    先頭に 0 をつける(例:0772)。注意:先頭ゼロは昔からの習慣で間違いやすい(後述)。 int c = 0772; // 506(8進数)
  • 16進数(hexadecimal)
    0x または 0X を先頭につける。例:0x1fa(これ = 506)。 int d = 0x1fa; // 506
  • long 型のリテラル
    値が int の範囲(約 ±2^31)を超える場合は L または l を付けて long を表します。慣例として大文字 L を使う(小文字 l は数字の 1 と見間違えるため)。 long big = 12345678901L;
  • 読みやすくするアンダースコア(_(Java 7 以降)
    大きな数を見やすくするために桁区切りとして _ を使える(ただし先頭・末尾・連続・小数点直前直後など場所には制約あり)。 int million = 1_000_000;

2. 同じ値を違う表記で書く例(重要な理解)

同じ「数」でも書き方が違うだけで、プログラム内では同じ値になります。
例:10進 506、2進 0b111111010、8進 0772、16進 0x1fa はすべて 同じ値(506) です。

class SameValue {
  public static void main(String[] args) {
    System.out.println(506);          // 10進
    System.out.println(0b111111010); // 2進 -> 506
    System.out.println(0772);        // 8進 -> 506
    System.out.println(0x1fa);       // 16進 -> 506
  }
}
Java

出力

506
506
506
506

3. よくある注意点(初心者がハマりやすいポイント)

  1. 文字列と数字を混同しない
    "123" は文字列(String)で、123 は数(int)。計算したければ数にする必要がある。 System.out.println("123" + 1); // "1231"(文字列連結) System.out.println(123 + 1); // 124(数の加算)
  2. 先頭に 0 を付けると「8進数」扱いになる
    たとえば 010 は十進の 10 ではなく、8進の 10 → 8(十進)になります。意図せず 0 を入れるとバグの元です。
    → 普段は先頭 0 を付けないようにするか、明示的に 0x(16進)や 0b を使いましょう。
  3. int の範囲を超えたら long を使う(L を付ける)
    たとえば 12345678901int に収まらないため、12345678901L とする必要があります。Lがないとコンパイルエラーになります。
  4. アンダースコアの使い方に注意
    1_000_000 は OK、_10001000_ はNG。小数点周りも制限あり(整数リテラルに使う分には比較的シンプル)。
  5. オーバーフロー
    計算で int の最大値を超えると「オーバーフロー」して負の値になったりします。大きな値を扱うときは型を long にするか、BigInteger を使います。

4. 実践的な例(サンプルコード) — コメントつきで解説します

例 A:10進・2進・16進を足して表示する

class ExampleA {
  public static void main(String[] args) {
    int dec = 100;         // 10進
    int bin = 0b1100100;   // 2進(100)
    int hex = 0x64;        // 16進(100)
    System.out.println(dec + bin + hex); // 100 + 100 + 100 = 300
  }
}
Java

出力

300

例 B:アンダースコアと long の例

class ExampleB {
  public static void main(String[] args) {
    int million = 1_000_000;           // 可読性のためのアンダースコア
    long big = 3_000_000_000L;         // long のリテラルには L を付ける
    System.out.println(million);
    System.out.println(big);
  }
}
Java

出力

1000000
3000000000

例 C:先頭の 0 による落とし穴(避けるべき)

class ExampleC {
  public static void main(String[] args) {
    int a = 010; // 8進の "10" -> 8(10進ではない)
    System.out.println(a); // 出力は 8
  }
}
Java

出力

8

010 を 10 と誤解するとバグになります。数字の先頭に 0 を付けるクセはつけない方が安全。

5. 練習問題(手を動かして確認しよう)

  1. 0b10100120xA はそれぞれ何(10進)になる?
    答:0b1010 = 10、012(8進) = 10、0xA = 10(すべて同じ)
  2. 次のコードの出力は?(予想してから実行してみよう) class Q2 { public static void main(String[] args) { System.out.println("5" + 3); System.out.println(5 + 3); } } 答: 53 8
  3. int x = 2147483647 + 1; の結果は?(2147483647int の最大値)
    答:オーバーフローして -2147483648 になる(意図しない結果に注意)。
  4. long l = 3000000000; はコンパイルする?もしエラーになるなら直すにはどうする?
    答:エラー(数値が int の範囲を超える)。long l = 3000000000L; のように L を付ける。
  5. int y = 1_2_3_4; は OK?→ 答:OK(アンダースコアは桁区切りとして使えるが、見やすさのため適切に使おう)

6. まとめ(要点だけ短く)

  • 整数リテラルは「数そのもの」をコードに直接書く方法。
  • 10進・2進(0b)・8進(先頭 0)・16進(0x)がある。
  • 先頭 0 に注意(8進になってしまう)。
  • long は末尾に L を付ける。
  • _ は桁区切りに使える(ただしルールあり)。
  • 文字列 "123" と数 123 は違う → 計算したければ数で書く。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました