カテゴリー
Java

Java(Step5-1)

基本型と演算

基本型

これまでは、色々型の変数や定数を使用してきましたが、Javaでは基本型と参照型があります。

基本型

前までは、主にint、double、String型の変数などを使用していました。Javaで利用できる型を大きく区別すると、以下の図のようになります。

  • 数値型(numeric type)…整数を表す5種類の整数型と、実数を表す2種類の浮動小数点型に分かれます。
  • 論理型(boolean type)…論理値を表す論理型は、真と偽のいずれかの値を表現する型です。
型とビビット

以前、説明したように変数は型から作られます。例えば、

int x; //int型の変数

と宣言されたxは、int型になります。式には型があり、型と値が同じであれば、記憶域上での内部表現も同じものになります。内部表現は、0または1の値を持つデータ単位であるビットの集まりになります。

整数型

整数型(integral)は、有限範囲の連続した整数を表現する型です。以下に示す5種類があります。

char, byte, short, int, long

これらの型では、小数点以下をもつ実数を表せません。各型で表現できる数値の範囲とビット数をまとめたのが以下の図になります。

整数型で表現できる範囲とビット数
  • char型

文字を表すための型になります。図に示すように、非負の値しか表せないという点で、他の型と異なります。0と正の値を表現する符号なし整数型です。

  • byte型/short型/int型/long型

整数を表すための型です。負の値、0、正の値を表現する符号付き整数型です。各型の表現できる値が異なるのは、構成ビット数が異なるからです。

性質と用途
byte名前が示す通りに、1バイト(8ビット)の整数。1バイトのデータを表す際に利用します。
short短い整数です。小さな値しか使わないことが分かっていて、記憶域を節約したい時に使います。
int整数型の中で最も基本的な型です。通常はこの型を使います。
long長い整数です。int型では、表現できない大きな値に使用します。
整数型の性質と用途
整数リテラル

整数型の定数を表すのが、整数リテラル(integer literal)ですが、詳しく説明していきます。

整数リテラルには以下の6種類があります。

  • 10進数リテラル(int型/long型)
  • 8進数リテラル(int型/long型)
  • 16進数リテラル(int型/long型)
整数接尾語

整数リテラルは、基本的にはint型です。整数接尾語(integer type suffix)と呼ばれる1またはLを末尾に付けた整数リテラルの型はlong型となります。

最小値最大値単項 – 演算子のオペランドの最大値
int021474836472147483648
long09223372036854775807L9223372036854775808L
10進数リテラルで表現できる最小値と最大値
8進数リテラルと10進数リテラルで表現できる最小値と最大値
10進整数リテラル

これまで使ってきた10や55といった整数リテラルは、日常で使う10進数で表されており、10進整数リテラル(decimal integer literal)と呼ばれます。

8進整数リテラル

8進整数リテラル(octal integer literal)は、10進整数リテラルと区別がつくように、先頭に0をつけて2桁以上で表記します。以下の2つの整数リテラルは、同じように見えますが値はまったく別物になります。

  • 13…10進整数リテラル(10進数での13)
  • 013…8進整数リテラル(10進数でノ11)
16進整数リテラル

16進整数リテラル(hexadecimal integer literal)は、先頭に0xまたは、0Xを付けて表記します。A~Fは大文字でも小文字でもOKです。

  • 0xA…16進整数リテラル(10進数での10)
  • 0x13…16進整数リテラル(10進数での19)

各整数リテラルを10進数で表示するプログラムを以下に示すので、確認してみましょう。

//DecOctHexLiteral.java
//整数リテラル(10進数/8進数/16進数)

public class DecOctHexLiteral {
    public static void main(String[] args){
        int a = 13; //10進数の13
        int b = 013; //8進数の13
        int c = 0x13; //16進数の13

        System.out.println("a = " + a);
        System.out.println("b = " + b);
        System.out.println("c = " + c);
    }    
}
DecOctHexLiteral.java実行結果
整数の内部

値はビットの並びとして表現されます。ここでは、byte型、short型、int型、long型の表現について説明していきます。

符号ビット

整数型の値が、どのようにビットで表されるか示したのが下の図になります。

int型の整数値25と-25の内部
非負の値

非負の値は、その2進表現を各ビットに対応させたものとして表されます。上の図が示すように10進数の25は2進数で11001なので、上位ビットは0で埋め尽くされます。

負の値

負の値は、2の補数表現という方法で表現されます。例えば、正の数の全ビットを反転したものは、1の補数と呼ばれます。そして、1の補数に1を加えたものが、2の補数になります。以下がその図になります。

正の値から2の補数表現を用いた負の値への変換

浮動小数点型

小数点以下の部分を持つ実数を表すのが、浮動小数点型(floating-point type)です。以下の2種類があります。

float, double

そして、次のプログラムは、これらの型の変数に数値を入れて表示するプログラムです。

//FloatDouble.java
//float型とdouble型の精度が有限であることを体感

public class FloatDouble {
    public static void main(String[] args){
        float a = 123456789;
        double b = 1234567890123456789L;

        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }    
}
FloatDouble.java実行結果

実行結果から変数に入れた値が正確に表現されていないことが分かります。整数型が有限範囲の連続した整数を表現するとは異なり、浮動小数点型の表現範囲は、大きさと精度の両方からの制限を受けるためです。

形式表現範囲精度ビット数
floatIEEE754形式±3.40282347E+38~±1.40239846E-45約6~7桁32
doubleIEEE754形式±1.79769313486231507E+378~±4.94065645841246544E-324約15桁64
浮動小数点型の特性
浮動小数点リテラル

57.3のように実数を表す定数を浮動小数点リテラル(floating-point literal)と呼びます。型を指定するのが、浮動小数点接尾語(float type suffix)です。float型を指定するのがfとFであり、double型を指定するのがdとDです。指定しない場合はdouble型とみなされることになっています。

論理型

論理値を表す論理型(boolean型)は、以下の文脈で利用することになります。

  • if文の制御式(条件判定のための式)
  • do文・while文・for文の制御式(繰り返しを続けるかどうかの判定のための式)
  • 条件演算子? : の第1オペランド
論理値リテラル

論理型の値を表すfalseとtrueが論理値リテラルと呼ばれ、構文図で表すと以下のようになります。

論理値リテラルの構文図

関係演算子・等価演算子・論理否定演算子が論理型の値を生成することを検証するプログラムを作ってみましょう。

//BooleanTester.java
//関係演算子・等価演算子・論理否定演算子が生成する値を表示
import java.util.Scanner;

public class BooleanTester {
    public static void main(String[] args){
        Scanner stdIn = new Scanner(System.in);
        System.out.print("整数a:"); int a = stdIn.nextInt();
        System.out.print("整数b:"); int b = stdIn.nextInt();

        System.out.println("a < b = " + (a < b));
        System.out.println("a <= b =" + (a <= b));
        System.out.println("a > b =" + (a > b));
        System.out.println("a >= b =" + (a >= b));
        System.out.println("a == b =" + (a == b));
        System.out.println("a != b =" + (a != b));
        System.out.println("!(a==0) =" + !(a == 0));
        System.out.println("!(b==0) =" + !(b == 0));

        stdIn.close();
    }
}
BooleanTester.java実行結果

「文字列+数値」と「数値̟+文字列」の演算では、数値が文字列に変換された上で連結されます同様に、「文字列+論理値」と「論理値+文字列」の演算では、論理型の値が”true”もしくは”false”という文字列に変換された上で連結が行われます。