前節で見たとおり、 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型のそれぞれに次のようなキーワードで指定できます。
Float.NaN
Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY
Double.NaN
Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY
整数型の場合は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
型に解釈されます。
int
型変数に代入できます。byte
, short
型変数へ代入すると、自動的に型変換されて代入できます。double
型変数へは代入できません。byte
, short
への代入は、代入先の変数の型に合わせて自動的に型変換されます。勿論、データ型の表現できる数値の範囲を超えたリテラルは代入できません。
小数のリテラルは内部的には double
型に解釈されます。
float
型へは代入できません。double
型変数に代入できます。long
型、float
型、double
型変数に代入する際には次のような注意が必要です。
型 | 表記法 | 意味 | |
---|---|---|---|
long 型 | 100L | 100 | |
float 型 | 3.14F | 3.14 | |
double 型 | 3.14D | 3.14 |
float
型や long
型にしたい場合は、リテラルの末尾に F
や L
を付けます。
次の例は 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を代入するとエラーとなります。