八 月
25
金曜日
2017

Java プリミティブデータ型

Java プリミティブデータ型に関するメモ。


プリミティブデータ型一覧

Javaにおけるプリミティブデータ型(基本データ型)には以下がある。

説明 サイズ
(bit)
範囲 規定値
byte 符号付き整数 8 -128 〜 127 0
short 符号付き整数 16 -32,768 〜 32,767 0
int 符号付き整数 32 -231〜231-1
(±21億1千万強)
桁数であれば9桁までOK。
0
long 符号付き整数 32 -263〜263-1
(±922京3千兆強)
桁数であれば18桁までOK。
0L
float 単精度浮動小数点 32 有効桁数 約7桁(10進数)
絶対値が1.4e-45 〜 3.4028235e+38の正負数
1.17549435e-38未満は非正規化数となり精度が低下する。
0.0f
double 倍精度浮動小数点 64 有効桁数 約16桁(10進数)
絶対値が4.9e-324 〜 1.7976931348623157e+308の正負数
2.2250738585072014e-308未満は非正規化数となり精度が低下する。
0.0d
boolean 真偽値 1 true または false false
char Unicode文字 16 \u0000\uFFFF \u0000

プリミティブデータ型に対応するラッパークラス

各プリミティブデータ型には対応したラッパークラスが存在する。
ラッパークラスは型の値をオブジェクトとして表現できるほか、型固有の操作や定数などが定義されている。

プリミティブデータ型 ラッパークラス
byte java.lang.Byte
short java.lang.Short
int java.lang.Integer
long java.lang.Long
float java.lang.Float
double java.lang.Double
boolean java.lang.Boolean
char java.lang.Character

MIN_VALUEとMAX_VALUE

java.lang.Character以外のラッパークラスには定数 MIN_VALUEMAX_VALUE が定義されており、そのプリミティブデータ型が扱える 最小値と最大値を表す。

浮動小数点とMIN_VALUE

符号付き整数のラッパークラスの定数 MIN_VALUE は負の最小値を表すが、 浮動小数点のラッパークラスの定数 MIN_VALUE は**正の最小値(表現できる最も0に近い数)**である点に注意。
また浮動小数点のラッパークラスには正規化数の最小値を表す定数 [MIN_NORMAL] (https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Float.html#MIN_VALUE)が定義されており、 MIN_VALUE 以上、MIN_NORMAL 未満の値は非正規化数 となる。

オートボクシング

プリミティブデータ型と対応するラッパークラス型は型としては別ものではあるが、 Java5から導入されたオートボクシング機能によって直接代入することができる。

プリミティブデータ型からラッパークラス型への変換をボクシング、その逆をアンボクシングと呼ぶ。

Integer wi = 10;              // ボクシング
int pi = Integer.valueOf(10); // アンボクシング

アンボクシングの際、ラッパークラス型のオブジェクトがnullだとNullPointerException が発生する。
もしメソッド呼び出しが無いにも関わらずNullPointerExceptoionが発生しているスタックトレースを見かけたらこのnullオブジェクトのアンボクシングを疑うと良い。

符号なし整数

Javaにおけるプリミティブデータ型の整数は全て符号付きだがJava8から各ラッパークラスに符号なし整数として扱うための各種メソッドが追加された。

例:java.lang.Integerの符号なし整数を扱うための各種メソッド

public static int compareUnsigned(int x, int y)
整数として比較する。
public static int divideUnsigned(int dividend, int divisor)
符号なし整数として除算した商を返す。
public static int parseUnsignedInt(String s)
引数の文字列が表す10進数を符号なし10進数としてパースする。
public static int parseUnsignedInt(String s, int radix)
基数指定付きで引数の文字列が表す符号なし整数をパースする。
public static int remainderUnsigned(int dividend, int divisor)
符号なし整数として割った余りを返す。
public static loとしてng toUnsignedLong(int x)
符号なしLongへ変換する。
public static String toUnsignedString(int i)
符号なし整数として文字列として返す。
public static String toUnsignedString(int i, int radix)
基数指定付きで符号なし整数として文字列として返す。

プリミティブデータ型変換

拡大変換

以下のケースは拡大変換と呼ばれる。
暗黙的に変換されるためキャストが不要。

変換元 変換先
byte shrot、int、long、float、double
short int、long、float、double
char int、long、float、double
int long、float、double
long float、double
float double

上記の整数から浮動小数点の拡大変換のうち、int -> floatlong -> floatlong -> double のケースでは 元の整数型が扱える桁数が変換先である浮動小数点型の有効桁数を超えているためIEEE754の最近接丸め(Round-to-nearest)が発生する場合がある。

縮小変換

以下のケースは縮小変換と呼ばれる。
明示的なキャストが必要。また縮小変換は変換先の型の方がサイズが小さい(または精度が低い)ため元の情報の一部を失うことになる。

変換元 変換先
short byte、char
char byte、short
int byte、short、char
long byte、 short、char、int
float byte、 short、 char、 int、 long
double byte、 short、 char、 int、 long、 float

プリミティブ型の符号付き整数は内部的に2の補数表現で値が保持されている。
縮小変換がかかると変換先に収まりきる下位ビット以外は切り捨てられその結果を2の補数表現として解釈される。

例:int型65535をbyte型へ縮小変換

int i = 65535; // 0b1111_1111_1111_1111
byte b = (byte)i; // 下位1バイトが残る0b1111_1111
System.out.println(b);

-1 // 0b1111_1111の2の補数表現(ビットを反転して1を足した結果の負数)

拡大縮小変換

byteからcharの変換はbyte -> int の拡大変換で一時的にint型となり int -> byte 縮小変換でcharに変換される。

プリミティブデータ型のリテラル表現

プリミティブデータ型のうちリテラル表現可能なデータ型は、 int long float double char boolean となっている。

int型のリテラルは基数に応じた以下の表記が可能。

基数 表記
10 プレフィックスなし 777
2 0bプレフィックス 0b0011_0000_1001
8 0プレフィックス 0001_411
16 0xプレフィックス 0x0319

int型以外のリテラル表記は以下。

表記
long Lまたはlサフィックス 777L
float Fまたはfサフィックス 777.777f
double Dまたはdサフィックス 777.777d
boolean true または false true
char シングルクォートで囲む '7'