基本データ型のリテラル

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

リテラルの表記方法

リテラルと型

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

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

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

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

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

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

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

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

FloatingValueDemo.java:

class FloatingValueDemo {
	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 FloatingValueDemo.java

C:\java>java FloatingValueDemo
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

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 型変数に代入する際には次のような注意が必要です。

リテラルの表記法
表記法 意味
long 100L 100
float 3.14F 3.14
double 3.14D 3.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.