基本データ型のリテラル

前節で見たとおり、 Java の変数に宣言するデータ型には8通りあります。それぞれに具体的な値を代入するのですが、型によっては値は Java 特有の特殊な書き方が必要です。

リテラルの表記方法

リテラルと型

ソースコードに記述された具体的な値のことをリテラルと呼びます。 JavaVM の内部コードでは各々が適切な基本データ型(プリミティブ型)に解釈されて演算されます。

基本的には日常生活で使っている値をそのまま記述すれば、日常的な感覚の通りに解釈されるのですが、次のような値には注意が必要です。

リテラルの表記法
表記法意味
符号付整数型
int
指数3*10E83*10^8(3×10の8乗)
指数1.0E-81.0*10^(-8)(1.0×10の-8乗)
8進数0748進数で74
16進数0x9c316進数で9c3
符号なし整数型
char
'a', '\u30c0'a, ダ
ブール代数型
boolean
true, false真、偽

上のように表記されたリテラルは適当な型に解釈されるので、同じ型の変数に代入することが出来ます。

浮動小数点数型の特殊な値

IEEE 754規格の浮動小数点数には、特殊な値として、非数 (NaN: Not a Number)、正の無限大 (POSITIVE_INFINITY)、負の無限大 (NEGATIVE_INFINITY) が指定可能です。double型、float型のそれぞれに次のようなキーワードで指定できます。

整数型の場合は0で割ると実行時に例外と呼ばれるエラーが発生しますが、浮動小数点数型の場合は、無限大が用意されているので、0で割ってもエラーになりません。

次のサンプルは、上記の特殊な定数が16進数表示でどのように表現されているのかを見るものです。

MAXDemo.java:

class MAXDemo {
	public static void main(String[] args) {
		System.out.println("Double.MAX_VALUE: " + Double.MAX_VALUE);
		System.out.println("\t16進数表示:" + Long.toHexString(Double.doubleToLongBits(Double.MAX_VALUE)));
		System.out.println("Double.POSITIVE_INFINITY: " + Double.POSITIVE_INFINITY);
		System.out.println("\t16進数表示:" + Long.toHexString(Double.doubleToLongBits(Double.POSITIVE_INFINITY)));
  		System.out.println("-Double.MAX_VALUE: " + -Double.MAX_VALUE);
		System.out.println("\t16進数表示:" + Long.toHexString(Double.doubleToLongBits(-Double.MAX_VALUE)));
		System.out.println("Double.NEGATIVE_INFINITY: " + Double.NEGATIVE_INFINITY);
		System.out.println("\t16進数表示:" + Long.toHexString(Double.doubleToLongBits(Double.NEGATIVE_INFINITY)));
		System.out.println("Double.MIN_VALUE: " + Double.MIN_VALUE);
		System.out.println("\t16進数表示:" + Long.toHexString(Double.doubleToLongBits(Double.MIN_VALUE)));
	}
}

Double.doubleToLongBits() は、引数のdouble値を表現するビット値を得るものです。ここで得られた値は 10 進数の Long 型であるため、16 進数表現に直すために、Long.toHexString() を使っています。2 進数表現を得たい場合は、代わりに Long.toBinaryString() を使ってください。

C:\java>javac MAXDemo.java
C:\java>java MAXDemo
Double.MAX_VALUE: 1.7976931348623157E308
        16進数表示:7fefffffffffffff
Double.POSITIVE_INFINITY: Infinity
        16進数表示:7ff0000000000000
-Double.MAX_VALUE: -1.7976931348623157E308
        16進数表示:ffefffffffffffff
Double.NEGATIVE_INFINITY: -Infinity
        16進数表示:fff0000000000000
Double.MIN_VALUE: 4.9E-324
        16進数表示:1
C:\java>

Double\POSITIVE_INFINITY の16進数表示は、 Double.MAX_VALUE に 1 加えたものであることがわかります。"7fefffffffffffff" に 1 を加えると、f が桁上がりして 0 になって、10 の位の f に 1 が加えられて桁上がりして、・・・e が f になって、つまるところ "7ff0000000000000" ということです。NEGATIVE_INFINITY も同様で、-Double.MAX_VALUE から 1 引いたものです。

リテラルの代入

整数、小数には複数の基本データ型が用意されています。リテラルは、整数は int 型、小数は double 型に解釈されます。それ以外の型の変数へ代入するときは次の規則に従います。

符号付整数型

整数のリテラルは内部的には int 型に解釈されます。

byte, short への代入は、代入先の変数の型に合わせて自動的に型変換されます。勿論、データ型の表現できる数値の範囲を超えたリテラルは代入できません。

浮動小数点数型

小数のリテラルは内部的には double 型に解釈されます。

注意すべきリテラル

long 型、float 型、double 型変数に代入する際には次のような注意が必要です。

リテラルの表記法
表記法意味
long100L100
float3.14F3.14
double3.14D3.14

float 型や long 型にしたい場合は、リテラルの末尾に FL を付けます。

サンプル

次の例は byte 型へリテラルを代入しています。

Literal.java:

class Literal {
	public static void main(String[] args) {
		//byte 型は -128 以上、 +127 以下
		byte b1 = 127;
		byte b2 = 128;	//エラー
		System.out.println(b1);
		System.out.println(b2);
	}
}
C:\Java>javac Literal.java
Literal.java:4: 精度が落ちている可能性
出現: int
要求: byte
                byte b2 = 128;
                          ^
エラー 1 個

byte 型には -128 から +127 までの値しか代入できないので、128を代入するとエラーとなります。



Copyright © 2001 SUGAI, Manabu. All Rights Reserved.